晚上,
我将头撞在墙上,遇到以下问题:
我正在使用Number
size=16
列中的单元格加载数字
和decimal places = 2
文件中的dBase III .dbf
。
使用DbfViewer
查看时,这些数字显示为:12345.12
,其中没有千位分隔符和小数
分隔符为.
。
我使用decimal.parse(val)
解析数据库中单元格的数字。
我用这个号码做的。
我正在使用ClosedXML
库将数字粘贴到.xlsx
Excel文件单元格中,其中包含以下公式:"=R[-1]C * 100/" & val
其中val
是值I从dBaseIII
数据库文件中获取。这是通过以下语句完成的:
Dim formula as String = "=R[-1]C * 100/" & project.TotalIncome(i)
cell.FormulaR1C1 = formula
。我正在使用两种编程环境:
Windows 8.1
机器Visual Studio 2013 Community
和Office 2010
。Windows 8.1
机器Visual Studio 2013 Ultimate
和Office 2013
。我确保两种环境都具有相同的Language, Date, Time and Number
格式,适用于Windows和Office。
当我从Option 1 Environment
构建并执行程序时,所有内容都在Excel文件中很好地粘贴。我导航到包含公式的单元格,并且获得的value
是否具有小数位,公式就在那里。
然而,如果我从Option 2 Environment
构建并执行该程序,我会得到:
Removed Records: Formula from /xl/worksheets/sheet.xml part
Removed Records: Formula from /xl/calcChain.xml part (calculation properties)
我尝试在Environment 2
中添加一个断点,打开Locals
窗口并编辑那些有小数位的values
,一切都按预期工作,而当我使用Environment 1
时当value
有小数位时,我没有任何麻烦。
我尝试了以下(在Environment 2
中):
Dim nfi As NumberFormatInfo = New CultureInfo("es-ES", False).NumberFormat
nfi.NumberDecimalSeparator = ","
value = Decimal.Parse(row("VALUECOL"), nfi)
也:
value = Decimal.Parse(row("VALUECOL"), New CultureInfo("es-ES"))
无济于事。
我在Environment 2
打开了包含Excel表信息的XML文件,发现了这个:
<x:c r="L101" s="41">
<x:f>L100 * 100/57125,71</x:f>
</x:c>
Environment 1
创建的同一XML文件的定义具有以下单元格值:
<x:c r="L101" s="41">
<x:f>L100 * 100/57125.71</x:f>
</x:c>
那么,它是一个Visual Studio Locale的东西(据我所见,两者都有相同的东西),还是我错过了其他东西?
编辑:打印出当前的区域设置:
Console.WriteLine(CultureInfo.CurrentCulture.Name)
在es-ES
和Environment 1
上产生相同的Environment 2
。
编辑2: 取自:Microsoft Office XML formats. Defective by design.
为节省时间,Microsoft选择使用美国英语存储XML 无论上述所有设置如何,都可以使用[...]
另外,对于Excel 公式,这意味着公式名称为美国英语 公式名称,[...]表示您愿意使用美国英语 功能名称(加上美国英语分隔符,...)。
所以基本上这一切都归结为(我相信)将decimal
值预先定位到Excel XML
并考虑到某事,某处。
在Environment 2
中,我写入Excel文件的任何其他(非公式)值都会在XML
中显示为en-US
本地化值(即12345.12
)。其中大多数是通过dataTable
导入引入的。但是,由于编写公式需要输入字符串,并且Visual Studio将语言环境设置应用于所述字符串,因此它在12345,12
中最终为Excel XML
,这会导致前面提到的错误。
因此,地球上的内容是Visual Studio从Environment 1
中获取不同而不是Environment 2
?所有可能的UI本地化选项在两台机器中完全相同......
答案 0 :(得分:1)
之前我遇到过类似的问题,发现我的项目引用中有一个不同的dll文件。 dll的命名是相同的,我只注意到文件大小的差异。一旦我在两台Dev机器上手动链接到同一台机器,我就得到了预期的结果。
就像我说的,我的问题不同......但它也涉及excel文件,我确实在一台Dev机器上安装了Excel 2010,在另一台机器上安装了Excel 2010.
答案 1 :(得分:1)
我甚至不知道这是否有资格作为答案,因为我仍然不知道Environment 1
与Environment 2
有何不同的本地化变量。
但是,使用不同的本地化时,似乎是Visual Studio - - 使用去除本地化的decimal
变量来处理内部,但使用本地化的string
变量。即使在调试期间检查locals
面板时,存储在decimal
条目中的dictionary
数字的值也会在keyValuePair
条目上显示为其本地化版本,并且展开时取消本地化en-US
值:
因此,在将dataTable
作为整体输出到Excel文件时,它会将en-US
值写入XML。另一方面,当输出公式(a.k.a.a string
)时,它会倾注相关decimal
值的本地化版本。
结论:在本地化系统中处理Office文件时,只需将数据写为去本地化(即en-US
),然后让软件为您进行本地化。
结束了以下脏补丁:
Dim formula As String = "=R[-1]C * 100/" & project.TotalIncome(i).ToString().Replace(",", ".")