1. 概述

在使用Apache POI处理日期时,确保它们的格式正确至关重要。

幸运的是,使用Apache POI设置日期格式非常简单。本教程将展示如何为日期定义自定义DataFormat作为CellStyle,以及如何使用现有的DataFormats

2. 起点

我们的起点是新的XSSFWorkbook、一个XSSFCell和已创建的CellStyle

XSSFWorkbook wb = new XSSFWorkbook();
CellStyle cellStyle = wb.createCellStyle();
wb.createSheet();
XSSFSheet sheet = wb.getSheetAt(0);
XSSFCell dateCell = sheet.createRow(0).createCell(0);
dateCell.setCellValue(new Date());

由于我们还没有设置期望的DataFormat,日期会被转换为数字并显示为:

44898,9262857176

这种表示方式对人类来说难以阅读。接下来,我们将探讨如何通过格式化实现更好的可视化。

2. 创建自定义DataFormat

首先,我们需要创建一个新的CreationHelper。使用CreationHelper,我们可以创建一个具有特定Format的新的DataFormat。这个DataFormat在内部存储,并由一个短标识符引用。我们需要将其添加到CellStyle中,并将CellStyle应用到Cell上:

CreationHelper createHelper = wb.getCreationHelper();
short format = createHelper.createDataFormat().getFormat("m.d.yy h:mm");
cellStyle.setDataFormat(format);
dateCell.setCellStyle(cellStyle);

设置自定义CellStyle后,我们的日期将被格式化:

02.12.2022 21:30

然而,当我们创建新的自定义DataFormat时,应始终记住Excel工作簿支持的最大单元格样式数量为65,000个。因此,我们应该始终重用现有的单元格样式,并在可能的情况下应用于多个单元格。

3. 使用默认DataFormat

正如我们所学,Apache POI使用短标识符链接到不同的DataFormats。Excel已经内置了许多预设的DataFormats,我们可以通过直接调用它们的短标识符来使用

cellStyle.setDataFormat((short) 14);
dateCell.setCellStyle(cellStyle);

然后,我们可以使用以下代码行获取DataFormat的字符串表示:

cellStyle.getDataFormatString();

在我们的示例中,我们将得到:

m/d/yy

最常见的DataFormats包括:

短值 格式
14 m/d/yy
15 d-mmm-yy
16 d-mmm
17 mmm-yy
18 h:mm AM/PM
19 h:mm:ss AM/PM
20 h:mm
21 h:mm:ss
22 m/d/yy h:mm

如果需要,我们应该始终使用这些数据格式之一,因为Excel会按照其预设格式显示,而不是自定义格式。这也将触发Excel使用本地化的格式化显示

4. 总结

正如我们所见,使用Apache POI设置日期格式既快速又简单,但也很重要,以确保在电子表格中以人类可读的方式呈现日期。下次我们在电子表格中处理日期时,应该尝试这样做。

完整的示例可在GitHub上找到。