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<LocalDateTime> {
|
|
// 支持的文本日期格式(按优先级尝试)
|
private static final List<DateTimeFormatter> 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<LocalDateTime> 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());
|
}
|
}
|
}
|