From d6c49b915f9428ce4f5da88e73b8c13fbe2f71eb Mon Sep 17 00:00:00 2001 From: Liang Date: Mon, 6 Mar 2023 03:59:59 +0000 Subject: [PATCH] =?UTF-8?q?!295=20=E6=96=B0=E5=A2=9EEasyExcel=E6=9E=9A?= =?UTF-8?q?=E4=B8=BE=E7=B1=BB=E6=95=B0=E6=8D=AE=E7=BF=BB=E8=AF=91=E6=B3=A8?= =?UTF-8?q?=E8=A7=A3=20*=20Merge=20remote-tracking=20branch=20'origin/dev'?= =?UTF-8?q?=20into=20dev=20*=20=E5=88=A9=E7=94=A8ReflectUtil=E5=8F=8D?= =?UTF-8?q?=E5=B0=84=E5=B7=A5=E5=85=B7=E7=B1=BB=E8=8E=B7=E5=8F=96Enum?= =?UTF-8?q?=E5=B1=9E=E6=80=A7=20*=20=E5=88=A9=E7=94=A8ReflectUtil=E5=8F=8D?= =?UTF-8?q?=E5=B0=84=E5=B7=A5=E5=85=B7=E7=B1=BB=E8=8E=B7=E5=8F=96Enum?= =?UTF-8?q?=E5=B1=9E=E6=80=A7=20*=20=E6=96=B0=E5=A2=9EEasyExcel=E6=9E=9A?= =?UTF-8?q?=E4=B8=BE=E7=B1=BB=E6=95=B0=E6=8D=AE=E7=BF=BB=E8=AF=91=E6=B3=A8?= =?UTF-8?q?=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/annotation/ExcelEnumFormat.java | 30 ++++++++ .../common/convert/ExcelEnumConvert.java | 75 +++++++++++++++++++ 2 files changed, 105 insertions(+) create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/annotation/ExcelEnumFormat.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/convert/ExcelEnumConvert.java diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/ExcelEnumFormat.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/ExcelEnumFormat.java new file mode 100644 index 000000000..a8f550a4a --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/ExcelEnumFormat.java @@ -0,0 +1,30 @@ +package com.ruoyi.common.annotation; + +import java.lang.annotation.*; + +/** + * 枚举格式化 + * + * @author Liang + */ +@Target({ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +@Inherited +public @interface ExcelEnumFormat { + + /** + * 字典枚举类型 + */ + Class> enumClass(); + + /** + * 字典枚举类中对应的code属性名称,默认为code + */ + String codeField() default "code"; + + /** + * 字典枚举类中对应的text属性名称,默认为text + */ + String textField() default "text"; + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/convert/ExcelEnumConvert.java b/ruoyi-common/src/main/java/com/ruoyi/common/convert/ExcelEnumConvert.java new file mode 100644 index 000000000..c69d90cfb --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/convert/ExcelEnumConvert.java @@ -0,0 +1,75 @@ +package com.ruoyi.common.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.ruoyi.common.annotation.ExcelEnumFormat; +import com.ruoyi.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) { + 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); + } +}