在日常开发中免不了要和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!)。
参考资料: