如何使用Apache POI读取Excel日期单元格的原始显示值(不格式化)
问题描述
我的Excel单元格中显示的日期为2022/11/30格式,但用Apache POI读取时输出的是11/30/22(mm/dd/yy),我需要获取单元格的原始显示值。试过以下几种方法,要么返回数值类型,要么得到错误的格式化结果:
DataFormatter df = new DataFormatter(); Cell sDate = row.getCell(1); // 方法1 FormulaEvaluator formeval = new XSSFFormulaEvaluator((XSSFWorkbook) workbook); String startDate = df.formatCellValue(sDate,formeval); print (startDate); // 方法2 String startDate = df.formatCellValue(sDate); print (startDate); // 方法3 print ( sDate.getNumericCellValue());
解决方法
Apache POI的DataFormatter会默认根据区域设置或内置规则格式化日期,若单元格用了自定义格式可能无法正确识别。直接获取单元格的格式字符串,手动格式化日期数值即可解决:
Cell sDate = row.getCell(1); if (sDate.getCellType() == CellType.NUMERIC && DateUtil.isCellDateFormatted(sDate)) { // 获取单元格的格式样式 CellStyle cellStyle = sDate.getCellStyle(); String excelFormat = cellStyle.getDataFormatString(); // 修正Excel格式字符串与Java SimpleDateFormat的差异:Excel用mm表月份,Java用MM String javaFormat = excelFormat.replace("mm", "MM"); SimpleDateFormat sdf = new SimpleDateFormat(javaFormat); // 将Excel日期数值转为Java Date,再按目标格式输出 Date date = DateUtil.getJavaDate(sDate.getNumericCellValue()); String originalDisplay = sdf.format(date); System.out.println(originalDisplay); }
注意事项
- Excel中日期本质是数值,
DateUtil.getJavaDate()负责把这个数值转成Java的Date对象。 - 若单元格用的是Excel内置日期格式而非自定义格式,可以通过
cellStyle.getDataFormat()获取格式编号,再通过DataFormat类映射到对应的格式字符串。
内容的提问来源于stack exchange,提问作者tiya
相关产品推荐
相关产品推荐

