Важно : Цель метода DataFormatter.formatCellValue()
- вернуть значение ячейки так, как оно показано в документе Excel .
Допустим, еслиВы зададите числовой формат в Excel , чтобы отобразить 4 дробных цифры, и ваш документ будет выглядеть так:

Ваш образец кода вернется-5,5706
;если вы измените числовой формат для отображения 8 дробных цифр - результат будет -5,57055337
.
По умолчанию числовой формат в Excel основан на 10 цифрах (в Apache POI * 1024).* проверьте ExcelGeneralNumberFormat.decimalFormat
константу), и похоже, что он используется в вашем документе на основе ваших выходных данных.
Решение
Как упоминается @samabcde(добавив мой ответ, чтобы исправить пару вопросов в своем ответе и предоставить дополнительную информацию), решение состоит в том, чтобы использовать cell.getNumericCellValue()
вместо:
DecimalFormat decimalFormat = new DecimalFormat("#.###############");
String cellValue = decimalFormat.format(cell.getNumericCellValue());
Здесь мы использовали формат "#.###############"
с 15 цифрами с тех пор, как он* Максимальная точность для Excel >>
Дополнительная информация
Обратите внимание на эту статью: При чтении Excelс POI, остерегайтесь плавающих точек
С точки зрения конфигурации DataFromatter
вы можете установить формат номера по умолчанию, используя DataFormatter#setDefaultNumberFormat(Format format)
, и он будет использоваться при вызовеformat.formatCellValue(cell)
, но только в случае использования неизвестных / неработающих форматов в Excel документ.
PS: Ответ на первый комментарий
Из вашего комментария не до конца понятны все случаи, когда выхочу охватить, предполагается, что DataFormatter
работает для вас во всех случаях, кроме числовых значений, и шаблон DecimalFormat
с "#.###############"
работает в этом случае для вас.В любом случае, если вам нужна более конкретная логика, потребуется просто проверить некоторые другие условия.
Пожалуйста, найдите служебный метод, который вы можете использовать в этом случае:
private static final DecimalFormat DECIMAL_FORMAT = new DecimalFormat("#.###############");
private static final DataFormatter DATA_FORMATTER = new DataFormatter();
public static String formatCellValue(HSSFCell cell) {
if (cell != null && cell.getCellTypeEnum() == CellType.NUMERIC
&& !DateUtil.isCellDateFormatted(cell)) {
return DECIMAL_FORMAT.format(cell.getNumericCellValue());
} else {
return DATA_FORMATTER.formatCellValue(cell);
}
}
Для Excel файл ниже:

- Поле A1 имеет формат 4 дробных цифры с действительным значением
28,9999999999999
- Поле A2 имеет формат 4 дробных знака с действительным значением
-5.5
- Поле A3 имеет формат по умолчанию Excel с реальным значением
28,9999999999999
Приведенный выше метод служебной программы будет возвращать реальные значения, то есть: 28,9999999999999
, -5.5
и 28,9999999999999
DataFormatter.formatCellValue()
вернет значения, как они выглядят в самом Excel , то есть: 29,0000
, -5,5000
и 29
.