2015-07-03 2 views
0

Я использую apache poi 3.10-FINAL, и при чтении чисел с листа excel я получаю очень странное поведение: действительно, результат cell.getNumericCellValue() на 0.001306 не 0.001306, а: 0.0013059999999 (!). И 2587441349.95676 становится 2.5874413499567585E9.Apache POI делает раунды по числовым значениям, которые он читает?

Я пробовал много разных вещей, например, меняя тип ячейки на «String» перед ее чтением (во всяком случае, числовые значения сразу меняются в строковые значения после прочтения ...) или с использованием метода getRawValue(), но если значение является хорошим, формат не равен: 0.001306 становится 1.306E-3, и я не могу применять правила форматирования, так как нет реального правила форматирования, единственное правило: оно должно быть похоже на то, что было в excel (одно значение может быть 00.001306, другое может быть 1.306E-3 ...)

Я попытался внести изменения в лист excel с кнопкой «ячейка формата», но он ничего не меняет . Единственный случай, когда эти числовые данные считаются строковыми значениями, - это когда простая простая цитата перед номером.

И ... Я не понимаю, почему, но кажется, что я единственный, кто встретит такую ​​проблему на земле ...?

(Извините за мой бедный английский ...)

+0

Добро пожаловать в [прекрасный мир чисел с плавающей запятой] (https://en.wikipedia.org/wiki/Floating_point)! Что произойдет, если вы попытаетесь использовать [DataFormatter.formatCellValue] (http://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/DataFormatter.html#formatCellValue%28org.apache.poi.ss.usermodel. Cell% 29) в ячейке, дает ли это ответ, который вы ожидали? – Gagravarr

+0

... делает, спасибо soOo много! – CPauline

ответ

1

Содействие комментарий к ответу

Добро пожаловать в wonderful world of Floating Point numbers! Файлы Excel .xlsx всегда сохраняют свои номера в виде строковых представлений чисел с плавающей запятой, а .xls выполняет почти во всех случаях, даже для простых целых значений.

По умолчанию Apache POI вернет вам значение, которое хранится в файле. Если значение не является точным в десятичном представлении с плавающей запятой, как и в вашем случае, вы получите это неточное значение точно так же, как в файле.

Однако, если вы хотите, это «строка, которая выглядит так, как показывает Excel для этой ячейки», то Apache POI имеет удобный метод утилиты, который делает округление/форматирование для вас на основе правил форматирования, применяемых к клетка. Этот класс DataFormatter, и метод, который вам нужен, - DataFormatter.formatCellValue(Cell)

Смежные вопросы