2016-02-12 71 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