描述:在进行导入导出操作时经常需要进行一些枚举值key value转换,利用EasyExcel的转换器,封装公共方法,简化这一操作。
公共枚举和转换器
基础枚举
import java.util.Objects;/*** <p>Title: 通用基础枚举接口</p>* <p>Description: 定义枚举类的通用行为,提供code与desc之间的转换功能</p>** @author Ryan*/
public interface BaseCodeDescEnum {/*** 获取枚举code值* @return code值*/int getCode();/*** 获取枚举描述信息* @return 描述信息*/String getDesc();/*** 根据code获取desc* @param enumClass 枚举类class* @param code code值* @param <E> 实现BaseCodeDescEnum的枚举类型* @return 对应的desc,未找到返回空字符串*/static <E extends Enum<E> & BaseCodeDescEnum> String getDescByCode(Class<E> enumClass, Integer code) {if (code == null) {return "";}for (E e : enumClass.getEnumConstants()) {if (e.getCode() == code) {return e.getDesc();}}return "";}/*** 根据desc获取code* @param enumClass 枚举类class* @param desc 描述信息* @param <E> 实现BaseCodeDescEnum的枚举类型* @return 对应的code,未找到返回null*/static <E extends Enum<E> & BaseCodeDescEnum> Integer getCodeByDesc(Class<E> enumClass, String desc) {if (desc == null) {return null;}for (E e : enumClass.getEnumConstants()) {if (Objects.equals(e.getDesc(), desc)) {return e.getCode();}}return null;}
}
通用枚举转换器
import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
import lombok.extern.slf4j.Slf4j;/*** <p>Title: 通用枚举转换器</p>* <p>Description: 用于Excel与Java枚举之间的数据转换,支持实现BaseCodeDescEnum接口的枚举类</p>** @author Ryan*/
@Slf4j
public class CommonEnumConverter<E extends Enum<E> & BaseCodeDescEnum> implements Converter<Integer> {private final Class<E> enumClass;public CommonEnumConverter(Class<E> enumClass) {this.enumClass = enumClass;}@Overridepublic Class<?> supportJavaTypeKey() {return Integer.class;}@Overridepublic CellDataTypeEnum supportExcelTypeKey() {return CellDataTypeEnum.STRING;}/*** Excel数据转换为Java数据* @param cellData Excel单元格数据* @param excelContentProperty Excel内容属性* @param globalConfiguration 全局配置* @return 转换后的Integer值*/@Overridepublic Integer convertToJavaData(CellData cellData, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) {if (cellData == null || cellData.getStringValue() == null) {return null;}Integer code = BaseCodeDescEnum.getCodeByDesc(enumClass, cellData.getStringValue());if (code == null) {log.warn("无法找到枚举描述'{}'对应的code值,枚举类型: {}",cellData.getStringValue(), enumClass.getSimpleName());}return code;}/*** Java数据转换为Excel数据* @param value Java中的Integer值* @param excelContentProperty Excel内容属性* @param globalConfiguration 全局配置* @return 转换后的Excel单元格数据*/@Overridepublic CellData<String> convertToExcelData(Integer value, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) {if (value == null) {return new CellData<>("");}String desc = BaseCodeDescEnum.getDescByCode(enumClass, value);if (desc == null || desc.isEmpty()) {log.warn("无法找到枚举code'{}'对应的描述值,枚举类型: {}",value, enumClass.getSimpleName());return new CellData<>("未知(" + value + ")");}return new CellData<>(desc);}
}
应用
具体枚举转换器
/*** <p>Title: 是否转换器</p>* <p>Description: Function Description </p>** @author Ryan*/
public class YesOrNoConverter extends CommonEnumConverter<YesOrNoEnum> {public YesOrNoConverter() {super(YesOrNoEnum.class);}
}
具体枚举
@Getter
public enum YesOrNoEnum implements BaseCodeDescEnum{/*** 0-否*/NO(0, "否"),/*** 1-是*/YES(1, "是");private final int code;private final String desc;YesOrNoEnum(int code, String desc) {this.code = code;this.desc = desc;}}
DTO应用
/*** 是否备注 0|否;1|是;*/@ExcelProperty(value = "是否备注", converter = YesOrNoConverter.class)private Integer isRemark;
