杰瑞科技汇

Java读取Excel日期,如何正确解析与转换?

Java 读取 Excel 日期数据

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

Java读取Excel日期,如何正确解析与转换?-图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 {
        // 读取 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 的库:

Java读取Excel日期,如何正确解析与转换?-图2
(图片来源网络,侵删)
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天)

如果日期不正确,可能需要调整:

Java读取Excel日期,如何正确解析与转换?-图3
(图片来源网络,侵删)
// 对于 1904 日期系统
Date date = DateUtil.getJavaDate(numericValue, false);

读取 Excel 日期数据的关键点:

  1. 检查单元格类型(CellType.NUMERIC
  2. 使用 DateUtil.isCellDateFormatted() 判断是否为日期格式
  3. 使用 DateUtil.getJavaDate() 将数字转换为日期
  4. 注意不同 Excel 版本的兼容性
  5. 处理时区和日期系统差异

根据你的具体需求选择合适的方法和库。

分享:
扫描分享到社交APP
上一篇
下一篇