Java使用Apache POI导出Excel时LocalDateTime传参setCellValue报错问询
问题原因
Apache POI的Cell.setCellValue()方法原生不支持java.time.LocalDateTime类型的入参,低版本POI仅支持java.util.Date、java.util.Calendar等JDK旧日期类,IDE的返回值改boolean的提示属于误判,无需参考。
解决方案
方案1:通用兼容方案(适配所有POI版本,保留Excel日期格式)
该方案可以让Excel识别该单元格为日期类型,支持后续筛选、计算等操作:
- 先在循环外创建日期专属的单元格样式,避免重复创建对象:
// 在你原有定义style的代码下方新增 CellStyle dateStyle = workbook.createCellStyle(); CreationHelper creationHelper = workbook.getCreationHelper(); // 可自定义日期显示格式,比如改为"yyyy/MM/dd HH:mm" dateStyle.setDataFormat(creationHelper.createDataFormat().getFormat("yyyy-MM-dd HH:mm:ss")); dateStyle.setWrapText(true);
- 把写入
created_dt的代码替换为以下内容:
cell = row.createCell(11); // LocalDateTime转Date,如需指定时区可替换ZoneId的参数 Date createdDt = Date.from(eCard.getCreated_dt().atZone(ZoneId.systemDefault()).toInstant()); cell.setCellValue(createdDt); cell.setCellStyle(dateStyle);
需要导入的依赖类如下:
import java.util.Date; import java.time.ZoneId;
方案2:无需转换方案(POI 4.0+版本支持)
如果你使用的POI版本可以升级,直接将Apache POI依赖升级到4.0及以上版本,该版本后setCellValue已经新增了LocalDateTime类型的入参支持,原有cell.setCellValue(eCard.getCreated_dt())代码可直接运行,无需修改。
方案3:纯文本写入方案
如果仅需要展示时间文本,不需要Excel的日期功能,可直接把LocalDateTime格式化为字符串写入:
cell = row.createCell(11); cell.setCellValue(eCard.getCreated_dt().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); cell.setCellStyle(style);
需要导入依赖类:
import java.time.format.DateTimeFormatter;
内容的提问来源于stack exchange,提问作者Alexander
相关产品推荐
相关产品推荐

