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

Apache POI写入0001年日期显示#######问题求助

解决Apache POI处理早年份Excel日期显示#######的问题

问题原因

  1. Excel日期系统限制:Excel默认的1900日期系统仅支持1900-01-01至9999-12-31的日期,早于1900年的日期无法被识别为有效日期,直接写入会导致显示异常。
  2. Java Date类型局限:java.util.Date的时间范围从1970年1月1日开始,无法准确表示公元1年这类早年份日期,写入Excel后会被解析为无效值。
  3. 日期格式错误:原代码中使用的YYYY-MM-DD是错误格式,大写Y代表“周年”而非日历年份,会导致年份显示逻辑错误。
  4. 单元格宽度不足:即使日期有效,若列宽不够也会显示#######。

解决方案(不使用字符串写入)

1. 切换到Java 8+日期API(推荐)

使用java.time.LocalDate替代java.util.Date,它支持从公元前到公元后的广泛日期范围,且Apache POI 4.0+版本原生支持该类型的写入。

2. 修正日期格式并设置单元格样式

使用小写yyyy表示日历年份,确保格式能正确解析早年份。

3. 自动调整列宽

避免因内容过长导致的显示异常。

修改后的代码示例

import java.time.LocalDate;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.DataFormat;
import org.apache.poi.ss.usermodel.Row;

public void addItem(LocalDate item, int columnNum, Row currentRow) {
    // 获取工作簿对象
    var workbook = currentRow.getSheet().getWorkbook();
    // 创建单元格样式
    CellStyle cellStyle = workbook.createCellStyle();
    DataFormat dataFormat = workbook.createDataFormat();
    
    // 设置正确的日期格式:小写yyyy表示日历年份
    cellStyle.setDataFormat(dataFormat.getFormat("yyyy-MM-dd"));
    
    // 创建单元格并写入LocalDate类型的日期
    Cell cell = currentRow.createCell(columnNum);
    cell.setCellValue(item);
    cell.setCellStyle(cellStyle);
    
    // 自动调整列宽,确保日期完全显示
    currentRow.getSheet().autoSizeColumn(columnNum);
}

额外注意事项

  • 确保使用Apache POI 4.0及以上版本,旧版本对Java 8日期API支持不完善。
  • 若必须保留java.util.Date参数,需先将Date转换为LocalDate(注意:Date无法表示1970年前的日期,转换会丢失准确性,不推荐)。

内容的提问来源于stack exchange,提问作者Daniel Brunner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 19:10:52