package org.ruoyi.common.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 lombok.extern.slf4j.Slf4j; import org.ruoyi.common.core.utils.reflect.ReflectUtils; import org.ruoyi.common.excel.annotation.ExcelEnumFormat; 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) { Object codeValue = cellData.getData(); // 如果是空值 if (ObjectUtil.isNull(codeValue)) { return null; } Map enumValueMap = beforeConvert(contentProperty); String textValue = enumValueMap.get(codeValue); return Convert.convert(contentProperty.getField().getType(), textValue); } @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); } }