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

标签 vb.net excel visual-studio locale openxml

晚上,

我正在用以下问题将头撞到墙上:

  • 我正在从带有 Numbersize=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 CommunityOffice 2010
  • 一台 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.

    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/

    相关文章:

    vba - Excel VBA;引用变量范围

    vb.net - VB.NET 中的高级 GUI 设计

    vb.net - “Conversion from type ' DBNull ' to type ' bool ' is not valid”,在检查它不是DBNull之后

    excel - 将重复条目与 Excel 中的唯一数据合并

    python - unoconv 将 .xlsx 文件导出为 png 等图像

    c++ - 无法将Visual Studio解决方案升级到2013

    visual-studio - Visual Studio-是否有快捷方式在选区周围插入括号?

    c# - 将第 3 方 C++ DLL 引用到 VS 2013 项目中

    mysql - 如何在应用程序仍打开时将 .mdf 和 .ldf 文件从一个位置复制到另一个位置?

    vb.net 文本框内的 C 代码