Чтение значения в Excel в Java, проблемы Windows против Linux - PullRequest
1 голос
/ 16 апреля 2020

У меня есть приложение с Java в Springboot, я читаю значение цифры c из ячейки 3123456,89 , мы используем в Excel формат европейские деньги -> . тысяча и , десятичные дроби.

String stringValue = new DataFormatter().formatCellValue(cell);

Я читаю ячейку как строку.

Затем я анализирую эту строку как двойную ->

Double.parseDouble(stringValue .replaceAll("\\.", "").replaceAll(",", "."));

Мне нужен этот анализ потому что мы вставляем цифры в европейском формате, но Java это американский формат (, тысяча и . десятичные дроби)

Этот процесс ПРАВИЛЬНО С WINDOWS.

Теперь я загружаю свое приложение в Linux, у меня есть проблемы ...

Теперь я получаю это значение -> 3,123,456,89, Если я использую замену -> "Error multiple points" Если я буду sh заменить , Я теряю часть десятичной дроби ...

Я использую apache .poi для чтения Excels.

  <!-- EXCELS -->
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>3.15</version>
    </dependency>

Наконец, в linux У меня есть проблемы с этим код, который в windows правильный. спасибо.

1 Ответ

2 голосов
/ 16 апреля 2020

Кажется, ваша проблема проистекает из того факта, что в вашей Linux системе Java используется значение по умолчанию Locale, отличное от вашей Windows системы.

Вы можете создать DataFormatter, имея специальный Locale. Если это Locale.US, то полная замена не потребуется, поскольку stringValue будет отформатирован для этого Locale.US. Затем вы можете использовать java.text.NumberFormat той же локали, чтобы получить Number из строки.

...
DataFormatter dataFormatter = new DataFormatter(java.util.Locale.US);
java.text.NumberFormat numberFormat = java.text.NumberFormat.getInstance(java.util.Locale.US);
String stringValue = dataFormatter.formatCellValue(cell);
Double doubleValue = null;
try {
 doubleValue = numberFormat.parse(stringValue).doubleValue();
} catch (Exception ex) {
 //do nothing
}
...

Другой подход заключается в получении значения ячейки в виде значения цифры 1027 * вместо отформатированной строки.

Для apache poi 3.15 это будет выглядеть следующим образом:

...
if (cell.getCellTypeEnum() == CellType.NUMERIC) {
 Double doubleValue = cell.getNumericCellValue();
}
...

См. Также https://poi.apache.org/components/spreadsheet/quick-guide.html#CellContents.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...