2014-06-27 77 views
2

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

我怎样才能得到输入的实际值,意思是“9.95”,知道试图获得这些值的代码事先并不知道它是小数还是数字。

+1

你见过[此msdn页面](http://msdn.microsoft.com/en-us/library/office/hh298534(v = office.15).aspx)?向下滚动到“检索值”部分。 – gunr2171

+0

@ gunr2171我有,它不回答问题 –

+0

http://www.cs.berkeley.edu/~fateman/264/papers/goldberg.pdf可能tl:博士你不能。 – pnuts

回答

1

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

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

另见本Critique of Excel XML Format

+0

有没有办法在C#/ OPENXML SDK中获得这个'.Text'? –

+0

@LuisFerrao我不知道。它必须存储在表示工作簿的xml文档中,至少格式化,所以它应该可以以某种方式访问​​,但我不熟悉C#/ OPENXML SDK –

+0

@LuisFerrao在这里看看对于excel xml的批评格式:http://www.codeproject.com/Articles/20246/Microsoft-Office-XML-formats-Defective-by-design#2 –

4

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中可以设计(通过将它们存储为小数,而不是浮动)来存储您键入的确切值,但arithmatic操作是因为所有的慢了许多计算将以软件而不是硬件完成。

+0

我知道它是作为浮点存储的,但是我想知道OPENXML SDK中是否有方法检索值,以向用户显示它的方式 –

+0

@Luis Ferrao:我不相信有。 OpenXml SDK没有内置逻辑,它只是提供一个原始对象,您可以将xlsx文件反序列化并操作它们。你或许可以通过检查应用于单元格的列宽和样式来弄清楚应该显示多少位。 –

0

按浮点Excel存储,尝试从float解析:

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

工作的呢?