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();
}
Это добавит числовую ячейку в электронную таблицу:
Примечание . Отображаемое значение — это отформатированное значение, но фактическое значение остается прежним . Если мы попытаемся получить доступ к той же ячейке, мы все равно получим 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();
}
Это добавит числовую ячейку в электронную таблицу и отобразит отформатированное значение, а также изменит фактическое значение :
Давайте утвердим фактическое значение в приведенном выше случае:
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 .