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. 只显示值的格式
首先,我们创建一个简单的工具方法来格式化单元格值:
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上找到。