讀取 Excel xlsx 精確度 (Precision)的問題...

讀取 Excel xlsx 精確度 (Precision)的問題...

最近,因為工作上的關係,使用必須上傳 Excel xlsx 檔案,然後 parse 裡面的資料匯入系統中。

讀取 xlsx 檔案,我們不僅僅是要讀取 Cell 的 Value,還要讀取 Cell 的 Style(例如: 顏色、粗體...等)

所以,一開始想到比較方便的做法是使用 ExcelPackage (Office Open XML Format file creation),不僅可以方便建立 xlsx 檔案、讀取 xlsx 也是相當方便。


後來,有一次檢查資料的時候突然發現出現一些模名其妙的資料,整個傻眼。

XLSX-0000

發現,在原始檔案中有些數值讀取的值會不精確,例如:

(1) Cell S10 的資料是 1.15 看到也是 1.15,但是從 ExcelPackage 會變成 1.14999999999。

(2) Cell Q5 原始資料 0.1,讀取變成 0.100000000000000004。

(3) Cell U8 原始資料為 9 ,讀取時變成 8.99999999996。

狀況其實還蠻多的,而且不只是浮點數會出現問題,整數也會有問題。 ("通用"格式或許通通都變成了浮點數???)


從直覺判斷應該是 IEEE 754 的關係,二進位轉十進位造成的誤差一直都存在。

參考:  Floating-point arithmetic may give inaccurate results in Excel

基本上,原始資料是從另一系統輸出的,所以每一個 Cell 都是存在資料,而不是 Cell 與 Cell 之間的公式 (Formula) 出現的問題。

死馬當活馬醫,想到 Excel 的進階選項【以顯示值為準 (Set precision as displayed)】,雖然會損失一些精確度,但是起碼可以眼見為憑吧 ?!

XLSX-0005

但是,後來經過實驗,數值讀取還是一樣會有問題。


ExcelPackage 讀取的方式:

XLSX-0002

 


下載 Open XML Format SDK 2.0 來讀取 xlsx 檔案,並且使用 DocumentReflector 來測試,還是會有精確度的問題。

XLSX-0001


如果使用 ADO.Net 來讀取 xlsx 檔案,其實數值是不會有問題的。但是有辦法可以讀取每一個 Cell 的 Style 嗎 ?

XLSX-0003


最後,我是使用 Microsoft.Office.Interop.Excel 12.0 的 PIA(Primary Interop Assemblies)來處理,可以讀取 Cell 的資料,同時也可以讀取 Style。

XLSX-0006 


不知道,有沒有什麼其他比較好的建議或是方法,撋還是只能將就點用了。