2016-02-12 1 views
0

Я использую POI из apache для чтения из файла Excel в Java-программе. В excel есть макросы, которые я воспроизвел на Java, но когда я сравниваю результаты, есть небольшие различия округления, которые я пытаюсь искоренить как можно больше. После загрузки кода POI 3.13 и запуска его в режиме отладки я понял, что они не обрабатывают числа, такие как Excel, который использует только 15 цифр и добавляет несущественные 0 после, но вместо этого использует представление на 17 цифр. Вы можете видеть это here. Но если глубже, кажется, что POI использует openxml и что openxml Cell уже хранит числа с плавающей запятой на 17 цифр вместо 15 ... Так что мне кажется, что есть ошибка в обработке числа в openxml, но я вполне удивил, что что-то, что «большое», как плохо обрабатывающее числа с плавающей запятой, раньше не было замечено, поскольку я ничего не могу с этим поделать.openxml и Excel Ограничение числа строк в цифрах

Так что мой вопрос: есть ли обходное решение, чтобы получить то же самое 15 цифр Excel при использовании POI? И лучше, может ли openxml быть исправленным, чтобы действовать как Excel по этому вопросу?

ответ

2

, но я очень удивлен, что то, что «большой», как плохо обработки чисел с плавающей точкой не был замечен до того

использование в Excel с плавающей точкой является ошибочным, так как хорошо документированы в § 2 из this article. Плохая попытка Microsoft притворяться, что значения являются 15-значной десятичной точкой с плавающей запятой, когда они действительно представляют собой 53-значную двоичную с плавающей запятой, только усугубляют ситуацию и вместо того, чтобы эмулировать ее, вы должны избегать использования Excel для серьезных вычислений. Вот цитата из заключения § 2:

Как пользователь Excel может предсказать, какие функции действуют при отображении вместо фактических значений? Какие выражения округляются косметически перед их отображением? Программа пользователя не может быть отлажена без осознания этих вопросов, и осведомленный пользователь в конечном итоге отлаживает благочестивое мошенничество Microsoft, а не только неисправную электронную таблицу Excel.

+0

Спасибо за эту ссылку. Я получаю более или менее проблему, но в моем случае я не хочу продолжать использовать Excel. Это инструмент, который используется сейчас, и я должен заменить его, реализуя макросы внутри него в программе Java. Но я все еще получаю начальные значения из электронной таблицы. И моя цель - сравнить результаты (которые сейчас отличаются), чтобы убедиться, что макросы реализованы правильно. Поэтому, даже если мы сможем утверждать, что Excel делает наилучшую реализацию, цель openXML должна быть максимально похожа на Excel, и здесь дело обстоит не так. Поэтому они должны делать то же самое «косметическое» округление. – julien