package com.ruoyi.common.utils; import com.alibaba.excel.converters.Converter; import com.alibaba.excel.enums.CellDataTypeEnum; import com.alibaba.excel.metadata.GlobalConfiguration; import com.alibaba.excel.metadata.data.ReadCellData; import com.alibaba.excel.metadata.property.ExcelContentProperty; import com.ruoyi.common.exception.base.BaseException; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; import java.util.Arrays; import java.util.Date; import java.util.List; public class LocalDateTimeStringConverters implements Converter { // 支持的文本日期格式(按优先级尝试) private static final List STRING_FORMATTERS = Arrays.asList( DateTimeFormatter.ofPattern("yyyy.MM.dd"), DateTimeFormatter.ofPattern("yyyy.M.d"), DateTimeFormatter.ofPattern("yyyy/MM/dd"), DateTimeFormatter.ofPattern("yyyy-MM-dd"), DateTimeFormatter.ofPattern("yyyyMMdd") ); @Override public Class supportJavaTypeKey() { return LocalDateTime.class; // 目标 Java 类型 } @Override public CellDataTypeEnum supportExcelTypeKey() { return CellDataTypeEnum.STRING; // 默认支持的 Excel 单元格类型 } @Override public LocalDateTime convertToJavaData(ReadCellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { // 检查单元格是否为空或无效值 if (cellData == null || cellData.getType() == null || (cellData.getType() == CellDataTypeEnum.EMPTY)) { return null; } // 根据单元格类型进行处理 switch (cellData.getType()) { case STRING: // 字符串类型 String dateString = cellData.getStringValue().trim(); if (dateString.isEmpty() || "/".equals(dateString)) { return null; // 特殊值处理 } // 尝试所有支持的日期格式 for (DateTimeFormatter formatter : STRING_FORMATTERS) { try { LocalDate localDate = LocalDate.parse(dateString, formatter); LocalDateTime localDateTime = localDate.atStartOfDay(); return localDateTime; // 设置默认时间为 00:00:00 } catch (DateTimeParseException ignored) { // 忽略单个格式的解析失败,继续尝试下一个格式 } } // 如果所有格式均失败,则抛出异常 throw new BaseException("无法解析字符串日期: " + dateString); case NUMBER: // 数值类型(Excel 日期格式) try { double excelNumber = cellData.getNumberValue().doubleValue(); Date date = org.apache.poi.ss.usermodel.DateUtil.getJavaDate(excelNumber, false); return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); } catch (Exception e) { throw new BaseException("无法解析数值日期: " + cellData.getNumberValue()); } case BOOLEAN: // 布尔类型 throw new BaseException("布尔类型不支持作为日期字段"); default: throw new BaseException("不支持的单元格类型: " + cellData.getType()); } } }