Java教程:如何使用EasyExcel导出模板文件并自定义下拉数据选项供用户选择

关注微信公众号(首席摸鱼师)免费查看全部文章

前言:

在SpringBoot项目中经常会使用EasyExcel做导入导出功能,有时会有这样的一个需求,就是在生成导入模板时,能自动的将一些选项值,字典值,状态值等带出来让用户自己去选择,可以避免填错其他值或者不知道填什么的一些问题,对用户来说是比较友好的
在这里插入图片描述
EasyExcel中提供了一个处理器接口:SheetWriteHandler,用于在导出Excel时处理sheet的创建和写入操作‌。它继承自WriteHandler接口,主要作用是在创建sheet前后执行特定的逻辑。可以利用SheetWriteHandler创建一个自定义的SheetWriteHandler并注册到EasyExcel中来实现这一目的,但每次不同的业务功能都需要定义却显得非常麻烦,本着省力少做多摸鱼的原则,我们可以将它封装成注解,下来主要说一下详细步骤。

一、 导入EasyExcel依赖

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.3.1 </version>
</dependency>
版本根据自己需要修改

二、创建一个下拉注解

import java.lang.annotation.*;

/**
 * 定义Excel列下拉列表属性的注解
 *  * @author wfeil211@foxmail.com
 */
@Documented
@Target({
   ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ExcelSelected {
   
    /**
     * 方式一:固定的下拉选项
     */
    String[] source() default {
   };

    /**
     * 方式二:提供动态下拉选项的类
     */
    Class<? extends ExcelDynamicSelect>[] sourceClass() default {
   };

    /**
     * 下拉列表的起始行(默认从第二行开始)。
     */
    int firstRow() default 1;

    /**
     * 下拉列表的结束行(默认到第65536行)。
     */
    int lastRow() default 65536;
}
其中有4个属性,分别代表如下:
 * source:适合少量数据,固定写好的值
 * sourceClass:自定义数据源,适合复杂数据来源,可以从数据库查询进行组装
 * firstRow:生效下拉的起始行,可修改
 * lastRow:生效下拉的结束行,可修改

三、 创建一个ExcelSelectedResolve类,用来解析下拉列表数据来源

import lombok.Data;
import lombok.extern.slf4j.Slf4j;

/**
 * 根据 ExcelSelected 注解解析下拉列表数据源。
 *
 * @author wfeil211@foxmail.com
 */
@Data
@Slf4j
public class ExcelSelectedResolve {
   
    /**
     * 下拉选项数组。
     */
    private String[] source;

    /**
     * 下拉列表的起始行。
     */
    private int firstRow;

    /**
     * 下拉列表的结束行。
     */
    private int lastRow;

    /**
     * 解析下拉列表数据来源
     *
     * @param excelSelected 下拉框注解对象
     * @return 下拉框选项数组
     */
    public String[] resolveSelectedSource(ExcelSelected excelSelected) {
   
        if (excelSelected == null) {
   
            return null;
        }

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

        // 方式二:获取动态下拉框的内容
        Class<? extends ExcelDynamicSelect>[] classes = excelSelected.sourceClass();
        if (classes.length > 0) {
   
            try {
   
                ExcelDynamicSelect excelDynamicSelect = classes[0]
### 如何使用 EasyExcel 实现模板导出设置下拉列表单元格 为了实现在 Excel 模板中创建带有下拉选项的单元格,可以利用 `EasyExcel` 提的功能来定义特定列的数据验证规则。这不仅限于简单的字符串匹配,还可以支持跨工作表引用等多种复杂场景。 下面是一个具体的例子展示如何向指定位置添加下拉菜单: #### 创建带下拉框的工作簿 ```java import com.alibaba.excel.EasyExcel; import com.alibaba.excel.write.handler.WriteHandler; public class DropdownExample { public static void main(String[] args) { String fileName = "example_with_dropdown.xlsx"; // 调用 write 方法写入文件注册自定义处理器用于处理每行数据前后的逻辑 EasyExcel.write(fileName).registerWriteHandler(new CustomCellWriteHandler()).sheet("Sheet1").doWrite(data()); } private static List<List<String>> data() { List<List<String>> list = new ArrayList<>(); for (int i = 0; i < 10; i++) { List<String> row = new ArrayList<>(); row.add("Item" + i); list.add(row); } return list; } } ``` 其中 `CustomCellWriteHandler` 是继承自 `AbstractRowWriteHandler` 的类,在这里实现了对某些特殊格式的支持,比如下拉列表: ```java import org.apache.poi.ss.usermodel.*; import java.util.Set; class CustomCellWriteHandler extends AbstractRowWriteHandler { @Override protected void afterRowCreate(WriteSheetHolder writeSheetHolder, Row row, Integer relativeRowIndex, Boolean isHead) throws Exception { Sheet sheet = writeSheetHolder.getSheet(); CreationHelper createHelper = sheet.getWorkbook().getCreationHelper(); // 定义下拉列表的内容源 Set<String> dropdownOptions = Sets.newHashSet("Option1", "Option2", "Option3"); // 构建DataValidationConstraint对象,它表示约束条件即允许输入哪些值 DataValidationConstraint constraint = createHelper.createExplicitListConstraint(dropdownOptions.toArray(new String[dropdownOptions.size()])); CellRangeAddressList addressList = new CellRangeAddressList( 1, // 开始行索引(从0开始) 9, // 结束行索引 0, // 列号(A列为0) 0 // 同一列结束的位置也是该列本身 ); // 将上述配置应用到实际区域上去形成完整的data validation rule DataValidation validationRule = createHelper.createDataValidation(constraint, addressList); // 添加至当前操作的工作表内 ((XSSFSheet) sheet).addValidationData(validationRule); } } ``` 此代码片段展示了怎样通过 POI 库提的 API 来构建一个基于显式枚举值得数据有效性规则,将其应用于目标范围内的所有单元格。注意这里的 `Set<String>` 可以替换为其他形式的数据结构以便更灵活地管理可选条目集[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值