Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# OpenXML值与Excel值不同_C#_.net_Openxml - Fatal编程技术网

C# OpenXML值与Excel值不同

C# OpenXML值与Excel值不同,c#,.net,openxml,C#,.net,Openxml,目前我正在使用OpenXMLSDK,与OpenXML中的值相比,Excel中显示的值有一个问题 基本上,我有一个excel电子表格,其中B4中的值为“202”。但是当我使用OpenXml从电子表格中读取值时,我收到的值是“201.99999999997” 我已经编写了一个测试应用程序来检查这些值,使用OpenXml读取Excel文件的代码如下: using (SpreadsheetDocument document = SpreadsheetDocument.Open(_excelFile1,

目前我正在使用OpenXMLSDK,与OpenXML中的值相比,Excel中显示的值有一个问题

基本上,我有一个excel电子表格,其中B4中的值为“202”。但是当我使用OpenXml从电子表格中读取值时,我收到的值是“201.99999999997”

我已经编写了一个测试应用程序来检查这些值,使用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>

39797
201.99999999999997
373
398
因此,正如您从XLSX文件XML中看到的,OpenXML正在读取正确的值。但是,Excel必须应用某种格式才能将值“201.99999999999997”显示为“202”。这是用户看到的值,因此这是使用OpenXML从XLSX文件读取时所期望的值

所以现在我想知道是否有人知道Excel应用了什么格式来获取用户在电子表格中看到的值,但是使用OpenXML


作为一项测试,我尝试重新创建电子表格,但有时在电子表格中输入整数后,数值显示为十进制。它是非常间歇性的,我无法解释或解决问题。

201.9999999999997是浮点数的真实表示形式。它可能并不总是准确的,例如要了解更多信息,请查看。所以你是对的,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.999999999997”转换为数字。如果您需要数字的字符串表示,请将其转换为数字,然后再转换回字符串。

我假设
GetCellValue
是“您自己的”方法。请同时提供此方法的实现。如果您能够提取并呈现单元格B4的完整XML数据,那将是非常棒的。完成!很抱歉错过了!我对百分数和小数也有类似的问题。。您是否找到了防止这种转换的解决方法?值得一提的是,在使用CultureInfo.InvariantCulture并将其转换回字符串时,您也应该将InvariantCulture应用于ToString,以避免格式错误。i、 e..ToString(CultureInfo.InvariantCulture)