使用Apache POI的HSSFWorkbook设置dd/MM/yyyy日期格式失效问题
问题
使用HSSFWorkbook生成带日期值的.xlsx文件,传入Date类生成的日期(示例:Wed Apr 19 15:00:17 IST 2023),并通过createHelper.createDataFormat().getFormat("dd/MM/yyyy")设置单元格日期格式为dd/MM/yyyy,但下载后的Excel中显示格式不符合预期(预期为19/04/2023)。
相关代码片段:
Workbook wb = new HSSFWorkbook(); CreationHelper createHelper = wb.getCreationHelper(); Sheet sheet = wb.createSheet("New Sheet"); Row row = sheet.createRow(0); Cell cell = row.createCell(0); cell.setCellValue("test"); CellStyle cellStyle = wb.createCellStyle(); cellStyle.setDataFormat( createHelper.createDataFormat().getFormat("dd/MM/yyyy")); cell = row.createCell(1); Date date = new Date(); System.out.println("Date :"+date); cell.setCellValue(date); cell.setCellStyle(cellStyle);
解决方法
1. 匹配Workbook类型与文件格式
HSSFWorkbook仅支持生成旧版.xls格式文件,若目标是.xlsx,必须替换为XSSFWorkbook——这是格式异常的核心原因,混用格式会导致Excel解析样式时出错。
修改初始化代码:
Workbook wb = new XSSFWorkbook(); // 替换原HSSFWorkbook
2. 正确设置日期格式
针对不同Workbook类型,采用对应的格式设置方式:
- XSSFWorkbook(.xlsx):
CellStyle cellStyle = wb.createCellStyle(); DataFormat dataFormat = createHelper.createDataFormat(); cellStyle.setDataFormat(dataFormat.getFormat("dd/MM/yyyy"));
- HSSFWorkbook(.xls):直接使用
HSSFDataFormat避免格式索引冲突:
HSSFDataFormat dataFormat = (HSSFDataFormat) wb.createDataFormat(); short formatIndex = dataFormat.getFormat("dd/MM/yyyy"); CellStyle cellStyle = wb.createCellStyle(); cellStyle.setDataFormat(formatIndex);
3. 规范日期值的设置
优先使用Calendar而非Date设置单元格值,避免时区解析问题,确保Excel识别为日期类型:
Calendar cal = Calendar.getInstance(); cell.setCellValue(cal);
内容的提问来源于stack exchange,提问作者Prakash
相关产品推荐
相关产品推荐

