Easyexcel生成excel并通过自定义注解实现下拉框以及动态下拉框(将数据库中的数据显示在excel下拉框中)

该博客介绍了如何使用EasyExcel库在Java中创建带有下拉框的Excel表格。通过自定义注解、解析类和处理器,实现了动态下拉框的数据填充,可以从数据库查询数据或者设置静态选项。同时提供了导出到本地文件和前端下载的实现代码,以及解决特定错误的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先需要定义excel实体类


@Data
@ColumnWidth(22)
@HeadRowHeight(30)
public class ExcelProductDTO {


    //动态下拉框,可以查询数据库数据显示在下拉框中
    @ExcelSelected(sourceClass = MyExcelSelected.class)
    @ExcelProperty(value = "生产厂家编号")
    private String producerCode;

    @ExcelSelected(source = {"高值","低值"})
    @ExcelProperty(value = "库存价值类型")
    private String stockValType;

    @ExcelSelected(source = {"耗材","普通设备","医疗设备"})
    @ExcelProperty(value = "库存类型")
    private String stockType;

 
    @ExcelSelected(source = {"有","无"})
    @ExcelProperty(value = "是否有明细")
    private Integer hasDetail;

    @ExcelSelected(source = {"药械","资产","设备"})
    @ExcelProperty(value = "业务类型")
    private String ywType;

   
    @ExcelSelected(source = {"虚库","实库"})
    @ExcelProperty(value = "是否虚库")
    private String isVirtual;

    @ExcelSelected(source = {"是","否"})
    @ExcelProperty(value = "是否进口")
    private String isImport;
}

自定义注解

@Documented
@Target({ElementType.FIELD})//用此注解用在属性上。
@Retention(RetentionPolicy.RUNTIME)//注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在;
public @interface ExcelSelected {
    /**
     * 固定下拉内容
     */
    String[] source() default {};

    /**
     * 动态下拉内容
     */
    Class<? extends ExcelDynamicSelect>[] sourceClass() default {};

    /**
     * 设置下拉框的起始行,默认为第二行
     */
    int firstRow() default 1;

    /**
     * 设置下拉框的结束行,默认为最后一行
     */
    int lastRow() default 0x10000;
}

 创建动态下拉框的接口,设置动态下拉框都实现该接口

public interface ExcelDynamicSelect {
    /**
     * 获取动态生成的下拉框可选数据
     * @return 动态生成的下拉框可选数据
     */
    String[] getSource();
}

自定义注解解析类  (反射)

//自定义注解解析
@Data
@Slf4j
public class ExcelSelectedResolve {
    /**
     * 下拉内容
     */
    private String[] source;

    /**
     * 设置下拉框的起始行,默认为第二行
     */
    private int firstRow;

    /**
     * 设置下拉框的结束行,默认为最后一行
     */
    private int lastRow;

    public String[] resolveSelectedSource(ExcelSelected excelSelected) {
        if (excelSelected == null) {
            return null;
        }

        // 获取固定下拉框的内容
        String[] source = excelSelected.source();
        if (source.length > 0) {
            return source;
        }

        // 获取动态下拉框的内容
        Class<? extends ExcelDynamicSelect&g
### 实现 EasyExcel 自定义下拉框注解的方式 在使用 EasyExcel 进行表格操作时,可以通过自定义注解实现单元格中的下拉框功能。以下是具体的实现方法: #### 1. 注解定义 创建 `@ExcelSelected` 注解,该注解可以支持固定内容的下拉框以及通过动态生成的内容。 ```java import java.lang.annotation.*; @Documented @Target({ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) public @interface ExcelSelected { /** * 固定下拉内容 */ String[] source() default {}; /** * 动态下拉选项的类 */ Class<? extends WhExcelDynamicSelect>[] sourceClass() default {}; /** * 下拉框的起始行,默认为第2行 */ int firstRow() default 1; /** * 下拉框的结束行,默认为最大值 */ int lastRow() default 0x10000; } ``` 此部分实现注解的基础结构[^3]。 #### 2. 动态下拉接口 为了支持动态内容的下拉框,需定义一个接口 `WhExcelDynamicSelect` 由具体实现类提供数据源。 ```java public interface WhExcelDynamicSelect { List<String> getOptions(); } ``` 在此基础上,开发者可以根据需求编写不同的实现类以返回所需的动态选项列表。 #### 3. 解析器逻辑 解析器负责处理带有 `@ExcelSelected` 注解的字段,将其转化为对应的下拉框配置。这一步骤通常涉及读取注解参数调用相应的工具完成写入操作。 ```java @Component public class ExcelSelectedResolve implements WriteHandler { private static final Logger logger = LoggerFactory.getLogger(ExcelSelectedResolve.class); @Override public void sheet(int sheetNo, Sheet sheet) {} @Override public void row(int rowNum, Row row) {} // 处理下拉框的具体逻辑... } ``` 解析器会依据注解内的属性(如 `source()` 或者 `sourceClass()`),决定如何填充目标单元格的数据验证规则[^1]。 #### 4. 数据处理器注册 最后,在初始化阶段需要将上述解析器绑定至 EasyExcel 的工作流中。这是通过扩展 `WriteHandler` 接口或者继承特定基类达成的。 ```java @Data public class SelectedSheetWriteHandler extends BaseCellDataConverter<SelectedSheetWriteHandler.CellExtraInfo> { ... } ``` 此类允许我们在导出过程中拦截指定事件对某些特殊标记做出响应[^1]。 以上即为基于 EasyExcel 构建自定义下拉框的主要流程概述。 ---
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值