【踩坑记录_01】springboot+easyexcel对枚举类型的处理

549 阅读2分钟

在日常开发中免不了要和excel文件打交道,对于简单的excel批量导入,在easyexcel官网中就给出了很多的例子,本文主要记录一下使用easyexcel导入数据时,对枚举类型的处理。

本文主要有以下内容:

  • 在批量导入时,枚举类型值为null的情况
  • 正确的写法

前置条件:Jdk版本为1.8,使用的easyexcel依赖如下:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.3.2</version>
</dependency>

枚举类代码:

@Getter
public enum StatusEnum {
​
    NORMAL_STATUS("001","正常"),
    FREEZE_STATUS("002","冻结"),
    EXCEPTION_STATUS("003","异常");
​
    private String code;
    @JsonValue
    private String desc;
​
    StatusEnum(String code, String desc) {
        this.code = code;
        this.desc = desc;
    }
}

在有了上面的前置条件下,就可以进行excel数据读取

踩坑写法

easyexcel的官网上,给出了一个自定义转换器的写法,只要我们实现Converter泛型接口,实现其中的convertToJavaData()方法即可,依葫芦画瓢,写出如下的代码:

@Slf4j
public class StatusConvert implements Converter<StatusEnum> {
    @Override
    public Class supportJavaTypeKey() {
        return StatusEnum.class;
    }
​
    @Override
    public StatusEnum convertToJavaData(ReadConverterContext<?> context) throws Exception {
        log.info("data = {}",context.getReadCellData().getData());
​
        StatusEnum[] values = StatusEnum.values();
        for (StatusEnum statusEnum:values){
            if (statusEnum.equals(context.getReadCellData().getData())){
                return statusEnum;
            }
        }
        return null;
    }
}

私以为可以正确导入数据,在数据导入的过程中,context.getReadCellData().getData()的值一直为null;无法正确读excel文件中的值。原以为是excel文件中的正常、异常、冻结的值该转变为枚举对象即NORMAL_STATUS、FREEZE_STATUS等,但经过测试,依旧无法争取读取值,转换防线,在此类中重写了如下方法:

@Override
public CellDataTypeEnum supportExcelTypeKey() {
    return CellDataTypeEnum.STRING;
}

本以为指定单元格的值类型可以正确读取,但经过测试,依旧无法达到预期的效果。

正确的写法

Converter接口中含有重载的convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration),于是乎改变了策略,采用如下的方式进行数据读取。

public class StatusConvert implements Converter<StatusEnum> {
    @Override
    public Class supportJavaTypeKey() {
        return StatusEnum.class;
    }
​
    @Override
    public CellDataTypeEnum supportExcelTypeKey() {
        return CellDataTypeEnum.STRING;
    }
​
    @Override
    public StatusEnum convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
        log.info("cellData = {}", cellData.getType());
        String stringValue = cellData.getStringValue();
        log.info("stringValue = {}", stringValue);
        for (StatusEnum statusEnum : StatusEnum.values()) {
            if (statusEnum.getDesc().equals(stringValue)) {
                return statusEnum;
            }
        }
​
        return null;
    }
}

经过测试,可以正确读取到excel中的数据。一个小知识(get!)。

参考资料: