在不同环境中的十进制解析差异

时间:2015-04-06 19:57:39

标签: vb.net excel visual-studio locale openxml

晚上,

我将头撞在墙上,遇到以下问题:

  • 我正在使用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
  • 我正在使用两种编程环境:

    1. Windows 8.1机器Visual Studio 2013 CommunityOffice 2010
    2. Windows 8.1机器Visual Studio 2013 UltimateOffice 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-ESEnvironment 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本地化选项在两台机器中完全相同......

2 个答案:

答案 0 :(得分:1)

之前我遇到过类似的问题,发现我的项目引用中有一个不同的dll文件。 dll的命名是相同的,我只注意到文件大小的差异。一旦我在两台Dev机器上手动链接到同一台机器,我就得到了预期的结果。

就像我说的,我的问题不同......但它也涉及excel文件,我确实在一台Dev机器上安装了Excel 2010,在另一台机器上安装了Excel 2010.

答案 1 :(得分:1)

我甚至不知道这是否有资格作为答案,因为我仍然不知道Environment 1Environment 2有何不同的本地化变量。

但是,使用不同的本地化时,似乎是Visual Studio - - 使用去除本地化的decimal变量来处理内部,但使用本地化的string变量。即使在调试期间检查locals面板时,存储在decimal条目中的dictionary数字的值也会在keyValuePair条目上显示为其本地化版本,并且展开时取消本地化en-US值:

Different localisations depending on representation

因此,在将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(",", ".")