From ca46c4076f2bcef067e3a0334749a3336aab8fb5 Mon Sep 17 00:00:00 2001 From: chenhongjie Date: Sat, 8 Nov 2025 10:47:09 +0800 Subject: [PATCH 1/2] =?UTF-8?q?Excel=E6=A8=A1=E7=89=88=E5=8A=A8=E6=80=81?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E4=B8=8B=E6=8B=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../excel/annotation/ExcelDynamicOptions.java | 20 +++++++++++++++++++ .../common/excel/core/ExcelDownHandler.java | 14 +++++++++++++ .../excel/service/ExcelOptionsProvider.java | 18 +++++++++++++++++ 3 files changed, 52 insertions(+) create mode 100644 ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelDynamicOptions.java create mode 100644 ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/service/ExcelOptionsProvider.java diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelDynamicOptions.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelDynamicOptions.java new file mode 100644 index 000000000..b0160b5b9 --- /dev/null +++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelDynamicOptions.java @@ -0,0 +1,20 @@ +package org.dromara.common.excel.annotation; + +import java.lang.annotation.*; + +/** + * Excel动态下拉选项注解 + * + * @author Angus + */ +@Target({ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +@Inherited +public @interface ExcelDynamicOptions { + + /** + * 提供者类全限定名 + * 实现org.dromara.common.excel.service.ExcelOptionsProvider实现类接口 + */ + Class providerClass(); +} diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/ExcelDownHandler.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/ExcelDownHandler.java index 139728390..cb6ced25a 100644 --- a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/ExcelDownHandler.java +++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/ExcelDownHandler.java @@ -23,7 +23,9 @@ import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.annotation.ExcelDynamicOptions; import org.dromara.common.excel.annotation.ExcelEnumFormat; +import org.dromara.common.excel.service.ExcelOptionsProvider; import java.lang.reflect.Field; import java.util.*; @@ -117,6 +119,18 @@ public class ExcelDownHandler implements SheetWriteHandler { ExcelEnumFormat format = field.getDeclaredAnnotation(ExcelEnumFormat.class); List values = EnumUtil.getFieldValues(format.enumClass(), format.textField()); options = StreamUtils.toList(values, Convert::toStr); + } else if (field.isAnnotationPresent(ExcelDynamicOptions.class)) { + // 处理动态下拉选项 + ExcelDynamicOptions dynamicOptions = field.getDeclaredAnnotation(ExcelDynamicOptions.class); + Class providerClass = dynamicOptions.providerClass(); + if (providerClass == null) { + throw new ServiceException("使用ExcelDynamicOptions注解,必须给providerClass赋予ExcelOptionsProvider的实现类" + + ",字段:{}", field.getName()); + } + // 通过反射获取提供者实例 + ExcelOptionsProvider provider = (ExcelOptionsProvider) SpringUtils.getBean(providerClass); + Set optionSets = provider.getOptions(); + options = new ArrayList<>(CollUtil.isNotEmpty(optionSets) ? new ArrayList<>(optionSets) : Collections.emptyList()); } if (ObjectUtil.isNotEmpty(options)) { // 仅当下拉可选项不为空时执行 diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/service/ExcelOptionsProvider.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/service/ExcelOptionsProvider.java new file mode 100644 index 000000000..f51d753ba --- /dev/null +++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/service/ExcelOptionsProvider.java @@ -0,0 +1,18 @@ +package org.dromara.common.excel.service; + +import java.util.Set; + +/** + * Excel下拉选项数据提供接口 + * + * @author Angus + */ +public interface ExcelOptionsProvider { + + /** + * 获取下拉选项数据 + * + * @return 下拉选项列表 + */ + Set getOptions(); +} -- Gitee From 282bf46abfac44da89efb555f13c21834601aa46 Mon Sep 17 00:00:00 2001 From: chenhongjie Date: Sat, 8 Nov 2025 10:58:00 +0800 Subject: [PATCH 2/2] =?UTF-8?q?Excel=E6=A8=A1=E7=89=88=E5=8A=A8=E6=80=81?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E4=B8=8B=E6=8B=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/dromara/common/excel/core/ExcelDownHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/ExcelDownHandler.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/ExcelDownHandler.java index cb6ced25a..b94c51410 100644 --- a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/ExcelDownHandler.java +++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/ExcelDownHandler.java @@ -127,7 +127,7 @@ public class ExcelDownHandler implements SheetWriteHandler { throw new ServiceException("使用ExcelDynamicOptions注解,必须给providerClass赋予ExcelOptionsProvider的实现类" + ",字段:{}", field.getName()); } - // 通过反射获取提供者实例 + // 获取提供者实例 ExcelOptionsProvider provider = (ExcelOptionsProvider) SpringUtils.getBean(providerClass); Set optionSets = provider.getOptions(); options = new ArrayList<>(CollUtil.isNotEmpty(optionSets) ? new ArrayList<>(optionSets) : Collections.emptyList()); -- Gitee