You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 09:20:40