From cf60a5cd30f4776e6a9e640bfa8083c0cda33b4f Mon Sep 17 00:00:00 2001 From: Liang Date: Sun, 5 Mar 2023 23:22:57 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=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 | 84 +++++++++++++++++++ 2 files changed, 114 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..97618f809 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/convert/ExcelEnumConvert.java @@ -0,0 +1,84 @@ +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 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) { + beforeConverter(contentProperty); + Object codeValue = cellData.getData(); + // 如果是空值 + if (ObjectUtil.isNull(codeValue)) { + return null; + } + Map enumValueMap = beforeConverter(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 = beforeConverter(contentProperty); + String value = Convert.toStr(enumValueMap.get(object)); + return new WriteCellData<>(value); + } + + private Map beforeConverter(ExcelContentProperty contentProperty) { + ExcelEnumFormat anno = getAnnotation(contentProperty.getField()); + Map enumValueMap = new HashMap<>(); + Enum[] enumConstants = anno.enumClass().getEnumConstants(); + for (Enum enumConstant : enumConstants) { + try { + Field codeFieldObj = enumConstant.getClass().getDeclaredField(anno.codeField()); + codeFieldObj.setAccessible(true); + Object codeValue = codeFieldObj.get(enumConstant); + Field textFieldObj = enumConstant.getClass().getDeclaredField(anno.textField()); + textFieldObj.setAccessible(true); + String textValue = (String) textFieldObj.get(enumConstant); + enumValueMap.put(codeValue, textValue); + } catch (NoSuchFieldException | IllegalAccessException e) { + log.error("枚举格式化转换处理异常", e); + throw new RuntimeException("枚举格式化转换处理异常"); + } + } + return enumValueMap; + } + + private ExcelEnumFormat getAnnotation(Field field) { + return AnnotationUtil.getAnnotation(field, ExcelEnumFormat.class); + } +} From 1bfeae3253e5c583d02b964895322ec1f3dbf2e6 Mon Sep 17 00:00:00 2001 From: Liang Date: Mon, 6 Mar 2023 08:29:40 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=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?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/convert/ExcelEnumConvert.java | 26 +++++++------------ 1 file changed, 9 insertions(+), 17 deletions(-) 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 index 97618f809..f3c8120ca 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/convert/ExcelEnumConvert.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/convert/ExcelEnumConvert.java @@ -10,6 +10,7 @@ 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; @@ -36,13 +37,13 @@ public class ExcelEnumConvert implements Converter { @Override public Object convertToJavaData(ReadCellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { - beforeConverter(contentProperty); + beforeConvert(contentProperty); Object codeValue = cellData.getData(); // 如果是空值 if (ObjectUtil.isNull(codeValue)) { return null; } - Map enumValueMap = beforeConverter(contentProperty); + Map enumValueMap = beforeConvert(contentProperty); String textValue = enumValueMap.get(codeValue); return Convert.convert(contentProperty.getField().getType(), textValue); } @@ -52,28 +53,19 @@ public class ExcelEnumConvert implements Converter { if (ObjectUtil.isNull(object)) { return new WriteCellData<>(""); } - Map enumValueMap = beforeConverter(contentProperty); - String value = Convert.toStr(enumValueMap.get(object)); + Map enumValueMap = beforeConvert(contentProperty); + String value = Convert.toStr(enumValueMap.get(object), ""); return new WriteCellData<>(value); } - private Map beforeConverter(ExcelContentProperty contentProperty) { + private Map beforeConvert(ExcelContentProperty contentProperty) { ExcelEnumFormat anno = getAnnotation(contentProperty.getField()); Map enumValueMap = new HashMap<>(); Enum[] enumConstants = anno.enumClass().getEnumConstants(); for (Enum enumConstant : enumConstants) { - try { - Field codeFieldObj = enumConstant.getClass().getDeclaredField(anno.codeField()); - codeFieldObj.setAccessible(true); - Object codeValue = codeFieldObj.get(enumConstant); - Field textFieldObj = enumConstant.getClass().getDeclaredField(anno.textField()); - textFieldObj.setAccessible(true); - String textValue = (String) textFieldObj.get(enumConstant); - enumValueMap.put(codeValue, textValue); - } catch (NoSuchFieldException | IllegalAccessException e) { - log.error("枚举格式化转换处理异常", e); - throw new RuntimeException("枚举格式化转换处理异常"); - } + Object codeValue = ReflectUtils.invokeGetter(enumConstant, anno.codeField()); + String textValue = ReflectUtils.invokeGetter(enumConstant, anno.textField()); + enumValueMap.put(codeValue, textValue); } return enumValueMap; } From 201faf93b420b2b11aa468b99ee7ed20de425722 Mon Sep 17 00:00:00 2001 From: Liang Date: Mon, 6 Mar 2023 08:32:04 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=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?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/convert/ExcelEnumConvert.java | 25 ++++++------------- 1 file changed, 8 insertions(+), 17 deletions(-) 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 index 97618f809..c69d90cfb 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/convert/ExcelEnumConvert.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/convert/ExcelEnumConvert.java @@ -10,6 +10,7 @@ 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; @@ -36,13 +37,12 @@ public class ExcelEnumConvert implements Converter { @Override public Object convertToJavaData(ReadCellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { - beforeConverter(contentProperty); Object codeValue = cellData.getData(); // 如果是空值 if (ObjectUtil.isNull(codeValue)) { return null; } - Map enumValueMap = beforeConverter(contentProperty); + Map enumValueMap = beforeConvert(contentProperty); String textValue = enumValueMap.get(codeValue); return Convert.convert(contentProperty.getField().getType(), textValue); } @@ -52,28 +52,19 @@ public class ExcelEnumConvert implements Converter { if (ObjectUtil.isNull(object)) { return new WriteCellData<>(""); } - Map enumValueMap = beforeConverter(contentProperty); - String value = Convert.toStr(enumValueMap.get(object)); + Map enumValueMap = beforeConvert(contentProperty); + String value = Convert.toStr(enumValueMap.get(object), ""); return new WriteCellData<>(value); } - private Map beforeConverter(ExcelContentProperty contentProperty) { + private Map beforeConvert(ExcelContentProperty contentProperty) { ExcelEnumFormat anno = getAnnotation(contentProperty.getField()); Map enumValueMap = new HashMap<>(); Enum[] enumConstants = anno.enumClass().getEnumConstants(); for (Enum enumConstant : enumConstants) { - try { - Field codeFieldObj = enumConstant.getClass().getDeclaredField(anno.codeField()); - codeFieldObj.setAccessible(true); - Object codeValue = codeFieldObj.get(enumConstant); - Field textFieldObj = enumConstant.getClass().getDeclaredField(anno.textField()); - textFieldObj.setAccessible(true); - String textValue = (String) textFieldObj.get(enumConstant); - enumValueMap.put(codeValue, textValue); - } catch (NoSuchFieldException | IllegalAccessException e) { - log.error("枚举格式化转换处理异常", e); - throw new RuntimeException("枚举格式化转换处理异常"); - } + Object codeValue = ReflectUtils.invokeGetter(enumConstant, anno.codeField()); + String textValue = ReflectUtils.invokeGetter(enumConstant, anno.textField()); + enumValueMap.put(codeValue, textValue); } return enumValueMap; }