package com.ycl.common.utils.excel.convert; import cn.hutool.core.annotation.AnnotationUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.util.ObjectUtil; 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.data.WriteCellData; import com.alibaba.excel.metadata.property.ExcelContentProperty; import com.ycl.common.utils.excel.annotation.ExcelEnumFormat; import com.ycl.common.utils.reflect.ReflectUtils; import lombok.extern.slf4j.Slf4j; import java.lang.reflect.Field; import java.util.HashMap; import java.util.Map; /** * 枚举格式化转换处理 * * @author Liang */ @Slf4j public class ExcelEnumConvert implements Converter { @Override public Class supportJavaTypeKey() { return Object.class; } @Override public CellDataTypeEnum supportExcelTypeKey() { return null; } @Override public Object convertToJavaData(ReadCellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { cellData.checkEmpty(); // Excel中填入的是枚举中指定的描述 Object textValue = switch (cellData.getType()) { case STRING, DIRECT_STRING, RICH_TEXT_STRING -> cellData.getStringValue(); case NUMBER -> cellData.getNumberValue(); case BOOLEAN -> cellData.getBooleanValue(); default -> throw new IllegalArgumentException("单元格类型异常!"); }; // 如果是空值 if (ObjectUtil.isNull(textValue)) { return null; } Map enumCodeToTextMap = beforeConvert(contentProperty); // 从Java输出至Excel是code转text // 因此从Excel转Java应该将text与code对调 Map enumTextToCodeMap = new HashMap<>(); enumCodeToTextMap.forEach((key, value) -> enumTextToCodeMap.put(value, key)); // 应该从text -> code中查找 Object codeValue = enumTextToCodeMap.get(textValue); return Convert.convert(contentProperty.getField().getType(), codeValue); } @Override public WriteCellData convertToExcelData(Object object, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { if (ObjectUtil.isNull(object)) { return new WriteCellData<>(""); } Map enumValueMap = beforeConvert(contentProperty); String value = Convert.toStr(enumValueMap.get(object), ""); return new WriteCellData<>(value); } private Map beforeConvert(ExcelContentProperty contentProperty) { ExcelEnumFormat anno = getAnnotation(contentProperty.getField()); Map enumValueMap = new HashMap<>(); Enum[] enumConstants = anno.enumClass().getEnumConstants(); for (Enum enumConstant : enumConstants) { Object codeValue = ReflectUtils.invokeGetter(enumConstant, anno.codeField()); String textValue = ReflectUtils.invokeGetter(enumConstant, anno.textField()); enumValueMap.put(codeValue, textValue); } return enumValueMap; } private ExcelEnumFormat getAnnotation(Field field) { return AnnotationUtil.getAnnotation(field, ExcelEnumFormat.class); } }