杰瑞科技汇

Java读取Excel日期为何总出错?

Java 读取 Excel 日期的完整指南

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

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 {
        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
    }
}

注意事项

  1. 日期格式问题:Excel 中的日期可能以数字形式存储,需要使用 DateUtil.isCellDateFormatted() 检查是否为日期格式。

  2. 1900/1904 纪元

    • Windows Excel 默认使用 1900 纪元
    • Mac Excel 默认使用 1904 纪元
    • 需要根据实际情况调整
  3. 时区问题:读取的日期可能需要根据时区进行调整。

    Java读取Excel日期为何总出错?-图2
    (图片来源网络,侵删)
  4. 字符串日期:有时日期可能以字符串形式存储,需要额外处理。

处理不同日期格式的示例

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 日期时,关键点在于:

  1. 检查单元格类型
  2. 判断是否为日期格式
  3. 根据不同类型采取不同处理方式
  4. 注意时区和纪元问题

选择合适的库(Apache POI、JExcelApi 或 EasyExcel)并根据实际需求处理日期格式。

Java读取Excel日期为何总出错?-图3
(图片来源网络,侵删)
分享:
扫描分享到社交APP
上一篇
下一篇