Перейти к основному содержимому

Числовой формат с использованием POI

· 3 мин. чтения

1. Обзор

В этом кратком руководстве мы покажем, как форматировать числовые ячейки в Excel с помощью Apache POI .

2. Апач POI

Apache POI — это чистый Java-проект с открытым исходным кодом. Он предоставляет библиотеки для чтения и записи файлов в форматах Microsoft Office, таких как Word, PowerPoint и Excel .

При работе с более новым форматом файлов .xlsx мы будем использовать класс XSSFWorkbook , а для формата .xls мы используем класс HSSFWorkbook .

3. Числовой формат

Метод setCellValue Apache POI принимает только значение double в качестве входных данных или входных данных, которые могут быть неявно приведены к типу double и возвращают числовое значение типа double . Метод setCellStyle используется для добавления необходимого стиля . Символ # в числовом форматировании Excel означает размещение цифры здесь, если это необходимо, тогда как символ 0 подразумевает всегда размещение цифры здесь, даже если это ненужный 0.

3.1. Формат только отображаемого значения

Давайте отформатируем двойное значение, используя такие шаблоны, как 0.00 или #.##. Во-первых, мы создадим простой служебный метод для форматирования значения ячейки:

public static void applyNumericFormat(Workbook outWorkbook, Row row, Cell cell, Double value, String styleFormat) {
CellStyle style = outWorkbook.createCellStyle();
DataFormat format = outWorkbook.createDataFormat();
style.setDataFormat(format.getFormat(styleFormat));
cell.setCellValue(value);
cell.setCellStyle(style);
}

Давайте проверим простой код для проверки упомянутого подхода:

File file = new File("number_test.xlsx");
try (Workbook outWorkbook = new XSSFWorkbook()) {
Sheet sheet = outWorkbook.createSheet("Numeric Sheet");
Row row = sheet.createRow(0);
Cell cell = row.createCell(0);
ExcelNumericFormat.applyNumericFormat(outWorkbook, row, cell, 10.251, "0.00");
FileOutputStream fileOut = new FileOutputStream(file);
outWorkbook.write(fileOut);
fileOut.close();
}

Это добавит числовую ячейку в электронную таблицу:

./557a1df6227da892f5947002d1c79314.png

Примечание . Отображаемое значение — это отформатированное значение, но фактическое значение остается прежним . Если мы попытаемся получить доступ к той же ячейке, мы все равно получим 10.251.

Давайте проверим фактическое значение:

try (Workbook inWorkbook = new XSSFWorkbook("number_test.xlsx")) {
Sheet sheet = inWorkbook.cloneSheet(0);
Row row = sheet.getRow(0);
Assertions.assertEquals(10.251, row.getCell(0).getNumericCellValue());
}

3.2. Формат для фактического и отображаемого значения

Давайте отформатируем отображаемые и фактические значения, используя шаблоны:

File file = new File("number_test.xlsx");
try (Workbook outWorkbook = new HSSFWorkbook()) {
Sheet sheet = outWorkbook.createSheet("Numeric Sheet");
Row row = sheet.createRow(0);
Cell cell = row.createCell(0);
DecimalFormat df = new DecimalFormat("#,###.##");
ExcelNumericFormat.applyNumericFormat(outWorkbook, row, cell, Double.valueOf(df.format(10.251)), "#,###.##");
FileOutputStream fileOut = new FileOutputStream(file);
outWorkbook.write(fileOut);
fileOut.close();
}

Это добавит числовую ячейку в электронную таблицу и отобразит отформатированное значение, а также изменит фактическое значение :

./e34a68af17f89de3a055eb8ef1c26f99.png

Давайте утвердим фактическое значение в приведенном выше случае:

try (Workbook inWorkbook = new XSSFWorkbook("number_test.xlsx")) {
Sheet sheet = inWorkbook.cloneSheet(0);
Row row = sheet.getRow(0);
Assertions.assertEquals(10.25, row.getCell(0).getNumericCellValue());
}

4. Вывод

В этой статье мы продемонстрировали, как отображать отформатированные значения с изменением или без изменения фактических значений числовых ячеек на листе Excel.

Все примеры кода, использованные в этом руководстве, доступны на GitHub .