Vb.net 不同环境下的十进制解析差异

Vb.net 不同环境下的十进制解析差异,vb.net,excel,visual-studio,locale,openxml,Vb.net,Excel,Visual Studio,Locale,Openxml,晚上, 我的头撞在墙上,有以下问题: 我正在从Number列的size=16 并且dBase III.dbf文件中的decimal places=2 使用DbfViewer查看这些数字时,显示为:12345.12,其中没有千位分隔符和小数点 分隔符是 我使用decimal.parse(val)解析数据库中单元格中的数字 我用那个号码做事 我使用ClosedXML库将数字粘贴到.xlsxExcel文件单元格中,公式如下:“=R[-1]C*100/”&val,其中val是我从dbaseii数据库文

晚上,

我的头撞在墙上,有以下问题:

  • 我正在从
    Number
    列的
    size=16
    并且
    dBase III.dbf
    文件中的
    decimal places=2

  • 使用
    DbfViewer
    查看这些数字时,显示为:
    12345.12
    ,其中没有千位分隔符和小数点 分隔符是

  • 我使用
    decimal.parse(val)
    解析数据库中单元格中的数字

  • 我用那个号码做事

  • 我使用
    ClosedXML
    库将数字粘贴到
    .xlsx
    Excel文件单元格中,公式如下:
    “=R[-1]C*100/”&val
    ,其中
    val
    是我从
    dbaseii
    数据库文件中获得的值。这是通过以下语句完成的:

    • Dim公式为String=“=R[-1]C*100/”&project.TotalIncome(i)
    • cell.FormulaR1C1=公式
  • 我使用两种编程环境:

  • 带有
    Visual Studio 2013社区的
    Windows 8.1
    计算机
    Office 2010
  • 带有
    Visual Studio 2013 Ultimate
    Office 2013
    Windows 8.1
    计算机
  • 我已确保这两种环境在Windows和Office中具有相同的
    语言、日期、时间和数字格式

当我从
选项1环境
构建并执行程序时,所有内容都会很好地粘贴到Excel文件中。我导航到包含公式的单元格,无论获得的
值是否有小数点,公式都在那里

但是如果我从
选项2环境构建并执行程序
,我会得到:

  • 删除的记录:公式来自/xl/worksheets/sheet.xml部分
  • 删除的记录:公式来自/xl/calcChain.xml部分(计算属性)
我尝试在
环境2
中添加一个断点,打开
局部变量
窗口,编辑那些有小数位的
,所有操作都按预期进行,而当我使用
环境1
时,当
有小数位时,我没有任何问题

我尝试了以下方法(在
环境2
):

此外:

value=Decimal.Parse(行(“VALUECOL”)、新文化信息(“es”))

无济于事

我已在
环境2
中打开包含Excel工作表信息的XML文件,并发现:

<x:c r="L101" s="41">
    <x:f>L100 * 100/57125,71</x:f>
</x:c>
那么,这是一个VisualStudio区域设置的东西(据我所知,两者都有相同的地方),还是我遗漏了其他东西


编辑:使用以下内容打印当前区域设置:

Console.WriteLine(CultureInfo.CurrentCulture.Name)

Environment 1
Environment 2
上产生相同的
es


编辑2: 摘自:

为了节省时间,微软选择使用美国英语存储XML 区域设置,而不考虑上面的所有设置。[……]

此外,对于Excel公式,这意味着公式名称为美国英语 公式名称,[…]表示您愿意用英语与我们合作 函数名(加上美式英文分隔符,…)

因此,基本上,这一切都归结为(我相信)将
decimal
值预先本地化为
excelxml
,并考虑到某些东西

Environment 2
中,我写入Excel文件的任何其他(非公式)值在
XML
中显示为
en-US
本地化值(即
12345.12
)。它们中的大多数都是通过
dataTable
import引入的。但是,由于编写公式需要输入字符串,并且Visual Studio将语言环境设置应用于所述字符串,因此在
Excel XML
中,它最终会变成
12345,12
,从而导致前面提到的错误


那么,Visual Studio究竟从
Environment 1
中吸取了哪些与
Environment 2
不同的东西呢?所有可能的UI本地化选项在两台机器中都完全相同

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


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

我甚至不知道这是否可以作为一个答案,因为我仍然不知道
环境1
环境2
不同的本地化变量在哪里

然而,Visual Studio在使用不同的本地化时,似乎在内部处理非本地化的
decimal
变量,但处理本地化的
string
变量。即使在调试过程中检查
locals
面板,存储在
字典
条目中的
decimal
数字的值也将在
keyValuePair
条目上显示为其本地化版本,并在展开时显示为非本地化的
en-US
值:

因此,当将
数据表作为一个整体
输出到Excel文件时,它将作为
en US
值写入XML。另一方面,当输出公式(也称为
string
)时,它会将相关
十进制数的本地化版本倒过来<x:c r="L101" s="41">
    <x:f>L100 * 100/57125,71</x:f>
</x:c>
<x:c r="L101" s="41">
    <x:f>L100 * 100/57125.71</x:f>
</x:c>
Dim formula As String = "=R[-1]C * 100/" & project.TotalIncome(i).ToString().Replace(",", ".")