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

发布时间:2021-03-07 00:41

我正在尝试在 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 AFTER“修复”并手动将字符串转换为十进制值,它们存储为

 <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));