Java 读取 Excel 日期数据
在 Java 中读取 Excel 文件中的日期数据时,需要注意 Excel 内部存储日期的特殊方式,以下是几种常用方法来正确处理 Excel 日期:

使用 Apache POI 读取日期
Apache POI 是最常用的 Java 操作 Excel 的库。
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileInputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
public class ExcelDateReader {
public static void main(String[] args) throws Exception {
// 读取 Excel 文件
FileInputStream fis = new FileInputStream("example.xlsx");
Workbook workbook = new XSSFWorkbook(fis);
Sheet sheet = workbook.getSheetAt(0);
// 获取日期单元格
Row row = sheet.getRow(0); // 假设日期在第1行
Cell cell = row.getCell(0); // 假设日期在第1列
// 处理日期单元格
if (cell.getCellType() == CellType.NUMERIC) {
if (DateUtil.isCellDateFormatted(cell)) {
// 如果单元格是日期格式
Date date = cell.getDateCellValue();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
System.out.println("日期: " + sdf.format(date));
} else {
// 如果单元格是数字但可能是日期
double numericValue = cell.getNumericCellValue();
Date date = DateUtil.getJavaDate(numericValue);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
System.out.println("日期: " + sdf.format(date));
}
}
workbook.close();
fis.close();
}
}
处理不同 Excel 版本的日期
- .xls (HSSF): 使用
HSSFWorkbook - .xlsx (XSSF): 使用
XSSFWorkbook
日期处理逻辑基本相同,但需要注意不同版本可能有细微差异。
处理日期格式
Excel 中的日期可能有不同的显示格式,但内部存储为数字:
// 获取单元格的日期格式
CellStyle style = cell.getCellStyle();
DataFormat format = workbook.createDataFormat();
String formatString = format.format(style.getDataFormat());
System.out.println("日期格式: " + formatString);
// 使用自定义格式解析
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
Date date = cell.getDateCellValue();
System.out.println("格式化日期: " + sdf.format(date));
使用 EasyExcel 阿里巴巴开源库
EasyExcel 是另一个流行的 Java 操作 Excel 的库:

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import java.util.Date;
public class EasyExcelDateReader {
public static void main(String[] args) {
String fileName = "example.xlsx";
EasyExcel.read(fileName, YourDataClass.class, new AnalysisEventListener<YourDataClass>() {
@Override
public void invoke(YourDataClass data, AnalysisContext context) {
// 处理数据,EasyExcel 会自动转换日期
System.out.println("日期: " + data.getDateField());
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
// 读取完成后的操作
}
}).sheet().doRead();
}
}
// 假设的数据类
class YourDataClass {
@ExcelProperty(value = "日期列")
private Date dateField;
// getters and setters
}
常见问题解决
问题1:日期读取为数字
如果日期显示为数字(如 44562),说明没有正确识别为日期格式,可以使用 DateUtil.getJavaDate() 转换:
double numericValue = cell.getNumericCellValue(); Date date = DateUtil.getJavaDate(numericValue);
问题2:时区问题
Excel 日期没有时区信息,Java 的 Date 对象会使用系统默认时区,如果需要特定时区:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
System.out.println("UTC日期: " + sdf.format(date));
问题3:1900/1904 日期系统
Excel 有两种日期系统:
- 1900 日期系统(默认,1900-1-1 为第1天)
- 1904 日期系统(1904-1-1 为第1天)
如果日期不正确,可能需要调整:

// 对于 1904 日期系统 Date date = DateUtil.getJavaDate(numericValue, false);
读取 Excel 日期数据的关键点:
- 检查单元格类型(
CellType.NUMERIC) - 使用
DateUtil.isCellDateFormatted()判断是否为日期格式 - 使用
DateUtil.getJavaDate()将数字转换为日期 - 注意不同 Excel 版本的兼容性
- 处理时区和日期系统差异
根据你的具体需求选择合适的方法和库。
