Apache POI写入0001年日期显示#######问题求助
解决Apache POI处理早年份Excel日期显示#######的问题
问题原因
- Excel日期系统限制:Excel默认的1900日期系统仅支持
1900-01-01至9999-12-31的日期,早于1900年的日期无法被识别为有效日期,直接写入会导致显示异常。 - Java Date类型局限:
java.util.Date的时间范围从1970年1月1日开始,无法准确表示公元1年这类早年份日期,写入Excel后会被解析为无效值。 - 日期格式错误:原代码中使用的
YYYY-MM-DD是错误格式,大写Y代表“周年”而非日历年份,会导致年份显示逻辑错误。 - 单元格宽度不足:即使日期有效,若列宽不够也会显示#######。
解决方案(不使用字符串写入)
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
相关产品推荐
相关产品推荐

