OpenXML值与Excel值不同
本文关键字:Excel 值与 OpenXML | 更新日期: 2023-09-27 18:01:02
我目前正在使用OpenXML SDK,与OpenXML中的值相比,Excel中显示的值有问题。
基本上我有一个excel电子表格,B4中的值是"202"。但是,当我使用OpenXml从电子表格中读取值时,我收到的值是"201.999999999999997"。
我已经编写了一个测试应用程序来检查值,我使用OpenXml读取Excel文件的代码如下:
using (SpreadsheetDocument document = SpreadsheetDocument.Open(_excelFile1, false))
{
WorkbookPart wbPart = document.WorkbookPart;
var sheet = wbPart.Workbook.Descendants<Sheet>().First();
var wsPart = (WorksheetPart)(wbPart.GetPartById(sheet.Id));
Cell cell1 = wsPart.Worksheet.Descendants<Cell>().Where(c => c.CellReference == "B4").FirstOrDefault();
Cell cell2 = wsPart.Worksheet.Descendants<Cell>().Where(c => c.CellReference == "C4").FirstOrDefault();
Cell cell3 = wsPart.Worksheet.Descendants<Cell>().Where(c => c.CellReference == "D4").FirstOrDefault();
Console.WriteLine(String.Format("Cell B4: {0}", GetCellValue(cell1)));
Console.WriteLine(String.Format("Cell C4: {0}", GetCellValue(cell2)));
Console.WriteLine(String.Format("Cell D4: {0}", GetCellValue(cell3)));
}
private static string GetCellValue(Cell cell)
{
if (cell != null) return cell.CellValue.InnerText;
else return string.Empty;
}
那么我得到的值如下:
Cell B4: 201.99999999999997
[更新-XLSX文件中的原始XML]
<row r="4" spans="1:4" x14ac:dyDescent="0.2">
<c r="A4" s="2">
<v>39797</v>
</c>
<c r="B4" s="3">
<v>201.99999999999997</v>
</c>
<c r="C4" s="3">
<v>373</v>
</c>
<c r="D4" s="3">
<v>398</v>
</c>
</row>
因此,您可以从XLSX文件XML中看到,OpenXML正在读取正确的值。但是,Excel必须应用某种格式才能将值"201.999999999999997"显示为"202"。这是用户看到的值,所以当使用OpenXML从XLSX文件读取时,这是他们期望的值。
所以现在我想知道是否有人知道Excel应用了任何格式来获得用户在电子表格中看到的值,但使用的是OpenXML。
作为一项测试,我尝试过重新创建电子表格,但有时当在电子表格中输入了一个整数时,值会显示为十进制。它非常断断续续,我无法解释或解决问题。
201.99999999999997是浮点数的实数表示。它可能并不总是准确的,要了解更多信息,请查看这里的示例。所以你是对的,excel应用了某种格式——有效数字。NET也可以这样做,看看这个:
static void Main(string[] args)
{
string s = "201.99999999999997";
// print s as string
Console.WriteLine(s);
// print s as double
Console.WriteLine(double.Parse(s, System.Globalization.CultureInfo.InvariantCulture));
// print s as double, converted back to string
Console.WriteLine(double.Parse(s, System.Globalization.CultureInfo.InvariantCulture).ToString());
Console.ReadKey();
// output is:
// 201.99999999999997
// 202
// 202
}
所以,如果您需要一个数字,请将"201.999999999999997"转换为数字。如果您需要数字的字符串表示,请将其转换为数字,然后再转换回字符串。