我正在尝试在 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 将正确解释,无需修复?
还没有尝试过这个,但是像这样的东西:
var nfi = System.Globalization.CultureInfo.InvariantCulture.NumberFormat;
...
cell.CellValue = new CellValue(d.ToString(nfi));