晚上,
我正在用以下问题将头撞到墙上:
Number
的 size=16
列的单元格中加载数字和
decimal places = 2
文件中的 dBase III .dbf
。 DbfViewer
查看时显示为: 12345.12
,其中没有千位分隔符和小数点分隔符是
.
。 decimal.parse(val)
解析数据库中单元格中的数字。 ClosedXML
库将数字粘贴到 .xlsx
Excel 文件单元格中,公式如下: "=R[-1]C * 100/" & val
其中 val
是我从 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.
To save them time, Microsoft chose to store XML using the US English locale regardless of all settings above. [...]
Also, for Excel formulas, it means the formula names are US English formula names, [...] it implies you are willing to work with US English function names (plus US English separators, ...).
所以基本上这一切都归结为(我相信)将
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 本地化选项在两台机器上都完全相同......
最佳答案
我之前也遇到过类似的问题,发现我的项目引用中有不同的dll文件。 dll 的名称相同,我只注意到文件大小不同。一旦我在两台开发机器上手动链接到同一个,我就得到了预期的结果。
就像我说的,我的问题是不同的......但它也涉及 excel 文件,我确实在一台开发机器上安装了 Excel 2010,在另一台机器上安装了 2013。
关于vb.net - 不同环境下的十进制解析差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29478642/