Java 读取 Excel 日期的完整指南
在 Java 中读取 Excel 文件中的日期值时,需要注意 Excel 日期的特殊存储方式,Excel 将日期存储为自 1900 年 1 月 1 日以来的天数(或 1904 年 1 月 1 日,取决于系统设置),因此需要特殊处理。

常用方法
使用 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 {
FileInputStream fis = new FileInputStream("example.xlsx");
Workbook workbook = new XSSFWorkbook(fis);
Sheet sheet = workbook.getSheetAt(0);
// 获取日期单元格
Row row = sheet.getRow(0);
Cell cell = row.getCell(0);
// 检查单元格类型是否为日期
if (cell.getCellType() == CellType.NUMERIC) {
// 检查是否为日期格式
if (DateUtil.isCellDateFormatted(cell)) {
Date date = cell.getDateCellValue();
System.out.println("日期: " + date);
// 格式化输出
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
System.out.println("格式化日期: " + sdf.format(date));
} else {
// 不是日期格式的数字
double numericValue = cell.getNumericCellValue();
System.out.println("数字值: " + numericValue);
}
} else if (cell.getCellType() == CellType.STRING) {
// 如果是字符串形式的日期
String dateStr = cell.getStringCellValue();
System.out.println("字符串日期: " + dateStr);
}
workbook.close();
fis.close();
}
}
使用 JExcelApi
import jxl.*;
import jxl.read.biff.BiffException;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
public class JExcelDateReader {
public static void main(String[] args) throws BiffException, Exception {
Workbook workbook = Workbook.getWorkbook(new File("example.xls"));
Sheet sheet = workbook.getSheet(0);
Cell cell = sheet.getCell(0, 0);
if (cell.getType() == CellType.DATE) {
DateCell dateCell = (DateCell) cell;
Date date = dateCell.getDate();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
System.out.println("日期: " + sdf.format(date));
}
workbook.close();
}
}
使用 EasyExcel (阿里巴巴)
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.metadata.data.ReadCellData;
import java.text.SimpleDateFormat;
import java.util.Date;
public class EasyExcelDateReader {
public static void main(String[] args) {
String fileName = "example.xlsx";
EasyExcel.read(fileName, Data.class, new AnalysisEventListener<Data>() {
@Override
public void invokeData(Data data, AnalysisContext context) {
System.out.println("读取到数据: " + data);
}
@Override
public void invokeHead(Map<Integer, ReadCellData<?>> headMap, AnalysisContext context) {
// 处理表头
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
System.out.println("所有数据解析完成!");
}
}).sheet().doRead();
}
public static class Data {
@ExcelProperty(index = 0)
private Date date;
// getter 和 setter
}
}
注意事项
-
日期格式问题:Excel 中的日期可能以数字形式存储,需要使用
DateUtil.isCellDateFormatted()检查是否为日期格式。 -
1900/1904 纪元:
- Windows Excel 默认使用 1900 纪元
- Mac Excel 默认使用 1904 纪元
- 需要根据实际情况调整
-
时区问题:读取的日期可能需要根据时区进行调整。
(图片来源网络,侵删) -
字符串日期:有时日期可能以字符串形式存储,需要额外处理。
处理不同日期格式的示例
if (cell.getCellType() == CellType.NUMERIC) {
if (DateUtil.isCellDateFormatted(cell)) {
// 处理标准日期格式
Date date = cell.getDateCellValue();
System.out.println("标准日期: " + date);
} else {
// 处理数字形式的日期
double numericValue = cell.getNumericCellValue();
Date date = DateUtil.getJavaDate(numericValue);
System.out.println("数字转换日期: " + date);
}
} else if (cell.getCellType() == CellType.STRING) {
// 处理字符串形式的日期
String dateStr = cell.getStringCellValue();
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = sdf.parse(dateStr);
System.out.println("字符串转换日期: " + date);
} catch (Exception e) {
System.out.println("无法解析的字符串日期: " + dateStr);
}
}
读取 Excel 日期时,关键点在于:
- 检查单元格类型
- 判断是否为日期格式
- 根据不同类型采取不同处理方式
- 注意时区和纪元问题
选择合适的库(Apache POI、JExcelApi 或 EasyExcel)并根据实际需求处理日期格式。

