2012-01-04 33 views
2

我有一點從的Excel 2010工作表中讀取值的問題。OpenXML的2.0獲取錯誤的單元格的值

在一個標準的Excel工作表2010我有保留兩位小數和值1270,14 €貨幣格式的單元格。

當我在OpenXML 2.0(C#代碼)上讀取此值時,我得到1270.1400000000001而不是原來的1270.14

同樣與其他的值發生在具有相同的格式化的任何細胞。從細胞的OpenXML代碼

獲得值:

private string GetCellValue(string column, int row) 
{ 
    column = column.ToUpper(); 
    var targetCell = cells.Where(p => p.CellReference == (column + row)).SingleOrDefault(); 

    var value = String.Empty; 

    if (targetCell.DataType != null && targetCell.DataType.Value == CellValues.SharedString) 
    { 
     var index = int.Parse(targetCell.CellValue.Text); 
     value = cellValues[index].InnerText.Trim(); 
    } 
    else 
    { 
     if (targetCell.CellValue != null) 
     { 
      value = targetCell.CellValue.Text.Trim(); 
     } 
     else 
     { 
      value = null; 
     } 
    } 

    return value; 
} 

具體值越過「如果」數據類型不爲空狀態,並與線檢索值:

value = targetCell.CellValue.Text.Trim();

這怎麼解決?

爲什麼這個錯誤甚至可能嗎?

+0

這已無關OpenXML的 - 這是使用「浮點運算」(在幾乎所有平臺,並與幾乎所有的語言)... Excel的格式不顯示值的一個固有的問題......你能做到相同... – Yahia 2012-01-04 21:03:32

+0

@Yahia - 如果該值是某種計算結果,但沒有,則可能是正確的。 「1270,14」是預先編制爲小數點後兩位數的單元格中的一個數字。由於我沒有進行任何類型的計算\公式,我不認爲這裏存在「浮點算術」的問題。 – Gil 2012-01-10 16:29:06

+0

你剛剛證明了我的觀點:單元格被格式化爲帶有2位小數的小數......但是當你從.NET訪問它時,你會得到一個double,而這又會容易產生任何「浮點算術」! – Yahia 2012-01-10 16:42:59

回答

1

雖然它可能不適合你的應用程序中,最簡單的解決將是簡單的四捨五入你值回然後分配或返回它適用。

+0

這是一個很好的解決方法,但問題是我沒有真正處理來自excel文件的任何信息,這意味着我可以讀取數字或簡單的文本,在這種情況下,您的代碼將會中斷。 – Gil 2012-01-05 09:53:45

+1

如果您想將您的顯示器與Excel相匹配,請查看http://stackoverflow.com/questions/4730152/what-indicates-an-office-open-xml-cell-contains-a-date-時間值您可以根據單元格格式設置字符串的格式。這似乎是您的應用程序最合適的答案 – emd 2012-01-05 21:21:29

2

由於號碼存儲爲雙在Excel中,您可以先解析字符串作爲雙,然後再轉換回字符串來獲取值顯示:

string s = Convert.ToDouble(value).ToString(); 

讓微軟處理自己的問題。