【问题标题】:Reading decimal value from an Excel cell (in C#)从 Excel 单元格中读取十进制值(在 C# 中)
【发布时间】:2014-06-27 14:15:33
【问题描述】:

从包含小数的 Excel 单元格中读取值时,我遇到了以下问题:如果我在 Excel 的单元格中输入 9.95,C# 中的CellValue.InnerText 将返回“9.9499999999999993”

我如何才能获得输入的实际值,即“9.95”,知道尝试获取这些值的代码事先并不知道它是小数还是数字。

【问题讨论】:

  • 你见过this msdn page吗?向下滚动到“检索值”部分。
  • @gunr2171 我有,但它没有回答问题
  • @pnuts 为什么要给我上浮点算术课,而我只想以 Excel 显示的方式获取(文本)值
  • 您将输入的实际值(用户输入的 9.95)与 Excel 存储的值 (9.94999993) 混淆了
  • 如果Excel不能确定,怎么改格式显示小数点后20位,还是显示9.950000000000000000,而不是存储值9.9499999999993?

标签: c# .net excel openxml-sdk


【解决方案1】:

Excel 将值存储为双精度 floating point 数字,因此很多时候您在 Excel 中输入的内容不能精确地存储为浮点数。

http://blogs.office.com/2008/04/10/understanding-floating-point-precision-aka-why-does-excel-give-me-seemingly-wrong-answers/

如果您真的想了解 Excel 是如何存储您的值的,您可以将 .xlsx 扩展名更改为 .zip,打开它并查看文件。这是存储在您的手机上的所有信息:

<sheetData>
    <row r="1" spans="1:1" x14ac:dyDescent="0.3">
        <c r="A1">
            <v>9.9499999999999993</v> 
        </c>
    </row>
</sheetData>

Excel 可以设计为存储您输入的确切值(通过将它们存储为十进制而不是浮点数),但算术运算会慢很多,因为所有计算都将在软件而不是硬件中完成。

【讨论】:

  • 我知道它是以浮点形式存储的,但我想知道 OPENXML SDK 中是否有办法以它向用户显示的方式检索值
  • @Luis Ferrao:我不相信有。 OpenXml SDK 没有内置逻辑,它只是提供了一个原始对象,您可以将 xlsx 文件反序列化并对其进行操作。不过,您可以通过检查应用于单元格的列宽和样式来确定应该显示多少位数来自己弄清楚。
【解决方案2】:

您无法检索为数字条目输入的实际值。我不相信它存储在任何地方。您看到的值是存储的值;您还可以检索显示的值(在 VBA 中它将是单元格的 .Text 属性),但我认为您无法获取输入的值。

这个问题与用二进制表示某些十进制数字的固有不可能性有关。

另见Critique of Excel XML Format

【讨论】:

  • 有没有办法在 C#/OPENXML SDK 中得到这个.Text
  • @LuisFerrao 我不知道。它必须存储在代表工作簿的 xml 文档中,至少作为格式,所以它应该可以以某种方式访问​​,但我不熟悉 C#/OPENXML SDK
  • @LuisFerrao 在这里查看对 excel xml 格式的评论:codeproject.com/Articles/20246/…
  • 我接受这个,因为来自 codeproject 的最后一个链接非常有用,谢谢
  • @LuisFerrao 谢谢。我会将该链接添加到我的答案中
【解决方案3】:

作为浮点数存储的excel,尝试从浮点数解析:

string curSep = System.Globalization.CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalSeparator;
string value = CellValue.InnerText.Replace(".", curSep);
value = value.Replace(",", curSep);
return float.Parse(value);

这行得通吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-01
    • 2014-03-03
    • 1970-01-01
    • 2018-05-27
    • 1970-01-01
    • 2013-07-09
    相关资源
    最近更新 更多