Apache POI 的数字格式
Contents
1.概述
在本快速教程中,我们将演示如何使用 Apache POI 在 Excel 中格式化数字单元格。
2. Apache POI
Apache POI 是一个开源的纯 Java 项目。它提供了用于读取和写入 Microsoft Office 格式文件的库,例如 Word、PowerPoint 和Excel 。
在使用较新的*.xlsx* 文件格式时,我们将使用 XSSFWorkbook类,对于*.xls* 格式,我们使用 HSSFWorkbook类。
3. 数字格式
Apache POI的setCellValue方法只接受double作为输入或可以隐式转换为double并返回double作为数值的输入。setCellStyle方法用于添加所需的样式。Excel 数字格式中的 # 字符意味着如果需要在此处放置一个数字,而字符 0 意味着始终在此处放置一个数字,即使它是不必要的 0。
3.1.仅显示值的格式
让我们使用 0.00 或 #.## 等模式格式化double。首先,我们将创建一个简单的实用方法来格式化单元格值:
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());
}