zhuo
2025-04-03 43026feb786493c98e57cf06d9d6e7be58688c88
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
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());
        }
    }
}