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();
}

这将在电子表格中添加带有数值的单元格:

RoundedValue

注意:显示值是格式化的值,但实际值保持不变。如果我们尝试访问同一单元格,仍然会得到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();
}

这将向电子表格中添加数值单元格,显示格式化后的值,并且还会改变实际值

excel_numeric

让我们确认上述情况下的实际值:

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上找到。