2016-02-12 72 views
0

我使用從apache的POI從Java程序中的Excel文件讀取。 excel有我在Java中複製的宏,但是當我比較結果時,我儘可能地根除了小的舍入差異。 下載POI 3.13的代碼並在調試模式下運行後,我意識到他們沒有處理像Excel這樣的數字,它只使用15位數字並在其後添加非重要的0,而是使用17位數的表示。你可以看到here。 但是更深層次看來,POI使用的是openxml,而openxml Cell已經將浮點數存儲在17位而不是15位......所以在我看來,在openxml中處理數字時存在一個錯誤,但我相當感到驚訝的是,之前沒有發現「大」的處理浮點數的問題,因爲我找不到任何相關信息。openxml和Excel 15數字數量限制

所以我的問題:是否有一個解決方法,以獲得完全相同的15位數字的Excel使用POI時?更好的辦法是,可以在這個問題上糾正像Excel一樣的openxml問題?

回答

2

,但我很驚訝的是,一些「大」的嚴重處理浮點數字尚未

之前發現

Excel的使用浮點的是錯誤的,在§以及詳細記錄2的this article。微軟試圖假裝這些值是15位十進制浮點數的時候,它們只是53位數的二進制浮點數,這隻會讓事情變得更糟,而不是模擬它,你應該避免使用Excel進行嚴重的計算。以下是來自§2的結論的引用:

Excel的用戶如何預測顯示哪些功能代替實際值而顯示?在顯示之前哪些表情在美觀方面變得圓潤?如果沒有意識到這些問題,用戶的程序就不能被調試,而知曉的用戶最終會調試微軟的虔誠的欺詐行爲,而不是僅僅是一個錯誤的Excel電子表格。

+0

感謝您的鏈接。我得到或多或少的問題,但在我的情況下,這不是我想繼續使用Excel。這是現在使用的工具,我將通過在Java程序中實現其內部的宏來取代它。但是我仍然從電子表格中獲得初始值。我的目標是比較結果(現在不同),以確保宏正確實施。因此,即使我們可以爭論Excel是否做得最好,openXML的目標是儘可能地與Excel相似,但這裏並不是這樣。所以他們應該做同樣的「美容」四捨五入。 – julien