当全球化将逗号设置为小数分隔符时,如何在 OpenXML Excel 单元格中存储小数/双精度

Posted

技术标签:

【中文标题】当全球化将逗号设置为小数分隔符时,如何在 OpenXML Excel 单元格中存储小数/双精度【英文标题】:How store decimal/doubles in OpenXML Excel cells when globalisation sets comma as decimal separator 【发布时间】:2021-03-07 00:41:50 【问题描述】:

我正在尝试在 OpenXML 中用 C# 创建 Excel 工作表,但最终 Excel 不得不“修复”工作簿,因为在 Excel /xl/worksheets/sheet1 中已使用逗号作为小数分隔符存储双精度数。 xml 文件。

我的 Excel 和 Windows 全球化是瑞典语,每当双精度转换为字符串时,它将小数分隔符设置为逗号。

当我做一个

double d = 355d/113d;
DocumentFormat.OpenXml.Spreadsheet.Cell cell = new Cell();
cell.CellValue = new CellValue(d);
cell.DataType = CellValues.Number;

Excel 的 /xl/worksheets/sheet1.xml 中实际存储的内容是

<x:c s="4" t="n">
    <x:v>3,14159292035398</x:v>
</x:c>

用逗号作为小数分隔符。这使我的瑞典 Excel 强制“修复”并将单元格转换为文本/字符串而不是数值。我可以在 Excel 中轻松地手动转换为数值,但这在此应用程序中是不可接受的。

查看“修复”后的 /xl/worksheets/sheet1.xml 并手动将字符串转换为十进制值,它们存储为

 <v>3.1415929203539825</v>

用点作为小数分隔符。 显而易见的解决方案 - 所以我认为 - 是用点而不是像

这样的东西强制存储我的十进制值
double d = 355d/113d;
DocumentFormat.OpenXml.Spreadsheet.Cell cell = new Cell();
cell.CellValue = new CellValue(d.ToString().Replace(",", ".").Replace(" ", ""));
cell.DataType = CellValues.Number;

还有一些 (!) 更多变体,以确保 cell.CellValue 包含点而不是逗号。但后来我的瑞典 Excel 变得疯狂,拒绝将值解释为小数,而是将其设为 int。

所以我被困住了。有没有人知道如何在 DocumentFormat.OpenXml.Spreadsheet.Cell 中存储一个十进制值,Excel 将在默认情况下使用逗号作为小数分隔符的系统中正确解释而无需修复?

【问题讨论】:

【参考方案1】:

还没有尝试过,但是类似的东西呢:

var nfi = System.Globalization.CultureInfo.InvariantCulture.NumberFormat;
...
cell.CellValue = new CellValue(d.ToString(nfi));

【讨论】:

以上是关于当全球化将逗号设置为小数分隔符时,如何在 OpenXML Excel 单元格中存储小数/双精度的主要内容,如果未能解决你的问题,请参考以下文章

NSNumberFormatter 适用于小数分隔符但不适用于逗号分隔符

用 TextField 中的小数分隔符替换逗号

在 SSMS 中导入平面文件时的小数分隔符

将小数分隔符从“,”(逗号)转换为“。” (点)例如“7,5”到“7.5”

当某些行包含逗号作为千位分隔符和“标志并且没有小数的行没有标志时如何在R中读取数据

在 SSMS 中导入平面文件时的小数分隔符