讀取 Excel xlsx 精確度 (Precision)的問題...
最近,因為工作上的關係,使用必須上傳 Excel xlsx 檔案,然後 parse 裡面的資料匯入系統中。
讀取 xlsx 檔案,我們不僅僅是要讀取 Cell 的 Value,還要讀取 Cell 的 Style(例如: 顏色、粗體...等)。
所以,一開始想到比較方便的做法是使用 ExcelPackage (Office Open XML Format file creation),不僅可以方便建立 xlsx 檔案、讀取 xlsx 也是相當方便。
後來,有一次檢查資料的時候突然發現出現一些模名其妙的資料,整個傻眼。
發現,在原始檔案中有些數值讀取的值會不精確,例如:
(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)】,雖然會損失一些精確度,但是起碼可以眼見為憑吧 ?!
但是,後來經過實驗,數值讀取還是一樣會有問題。
ExcelPackage 讀取的方式:
下載 Open XML Format SDK 2.0 來讀取 xlsx 檔案,並且使用 DocumentReflector 來測試,還是會有精確度的問題。
如果使用 ADO.Net 來讀取 xlsx 檔案,其實數值是不會有問題的。但是有辦法可以讀取每一個 Cell 的 Style 嗎 ?
最後,我是使用 Microsoft.Office.Interop.Excel 12.0 的 PIA(Primary Interop Assemblies)來處理,可以讀取 Cell 的資料,同時也可以讀取 Style。
不知道,有沒有什麼其他比較好的建議或是方法,撋還是只能將就點用了。