EasyExcel导出表格带 下拉筛选

CustomSheetWriteHandler

package com.ly.cloud.handler;

import com.alibaba.excel.write.handler.SheetWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddressList;

import java.util.Map;
import java.util.TreeMap;

/**
 * 这个类的作用主要是给列增加下拉框
 * 主要是为了方便用户填写数据
 */

public class CustomSheetWriteHandler implements SheetWriteHandler {

    /**
     * 存放下拉内容的集合
     * key为列的下标, value为下拉内容数组
     */
    private final Map<Integer, String[]> map = new TreeMap<>();

    /**
     * 工作簿下标,从0开始
     */
    private int index = 0;

    /**
     * 给多少行添加下拉框,这里默认给2000行
     */
    private final int batchSize = 2000;



    @Override
    public void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {

    }

    /**
     * 宝藏在此:如果下拉框内容总的长度超过255,会导致Cell有下拉框,但是下拉内容显示不了,
     * 这时我们可以新建一个sheet,将其隐藏,然后将里面的内容引用到我们的下拉框列就可以。
     * 值得细品
     * @param writeWorkbookHolder
     * @param writeSheetHolder
     */
    @Override
    public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {

        // excel下标从0开始,这里第三列的下拉选择内容
        map.put(4, new String[]{"居民身份证", "护照", "港澳居民来往内地通行证", "台湾来往大陆通行证"});

        DataValidationHelper helper = writeSheetHolder.getSheet().getDataValidationHelper();
        map.forEach((k, v) -> {
            // 创建sheet,突破下拉框255的限制
            // 获取一个workbook
            Workbook workbook = writeWorkbookHolder.getWorkbook();
            // 定义sheet的名称
            String sheetName = "sheet" + k;
            // 1.创建一个隐藏的sheet 名称为 proviceSheet
            Sheet proviceSheet = workbook.createSheet(sheetName);
            // 从第二个工作簿开始隐藏
            this.index++;
            // 设置隐藏
            workbook.setSheetHidden(this.index, true);
            // 2.循环赋值(为了防止下拉框的行数与隐藏域的行数相对应,将隐藏域加到结束行之后)
            for (int i = 0, length = v.length; i < length; i++) {
                // i:表示你开始的行数 0表示你开始的列数
                proviceSheet.createRow(i).createCell(0).setCellValue(v[i]);
            }
            Name category1Name = workbook.createName();
            category1Name.setNameName(sheetName);
            // 4 $A$1:$A$N代表 以A列1行开始获取N行下拉数据
            category1Name.setRefersToFormula(sheetName + "!$A$1:$A$" + (v.length));
            // 5 将刚才设置的sheet引用到你的下拉列表中,1表示从行的序号1开始(开始行,通常行的序号为0的行是表头),50表示行的序号50(结束行),表示从行的序号1到50,k表示开始列序号和结束列序号
            CellRangeAddressList addressList = new CellRangeAddressList(1, batchSize, k, k);
            DataValidationConstraint constraint8 = helper.createFormulaListConstraint(sheetName);
            DataValidation dataValidation3 = helper.createValidation(constraint8, addressList);

            // 阻止输入非下拉选项的值
            dataValidation3.setErrorStyle(DataValidation.ErrorStyle.STOP);
            dataValidation3.setShowErrorBox(true);
            dataValidation3.setSuppressDropDownArrow(true);
            dataValidation3.createErrorBox("提示", "此值与单元格定义格式不一致");
            // validation.createPromptBox("填写说明:","填写内容只能为下拉数据集中的单位,其他单位将会导致无法入仓");
            writeSheetHolder.getSheet().addValidationData(dataValidation3);
        });
    }
}

调用:

  EasyExcel.write(response.getOutputStream(), clazz)
                    .autoCloseStream(Boolean.TRUE)    //自动关闭流
                    .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 设置自适应列宽
                    .registerWriteHandler(new FormatSheetWriteHandler())  // 设置文本格式
                    .registerWriteHandler(new CustomSheetWriteHandler())    //增加下拉框策略
                    .sheet(fileName)
                    .doWrite(dataList);

效果图:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
使用EasyExcel可以轻松地导出表格并进行下载。首先,您需要在您的项目中添加EasyExcel的依赖。然后,您可以创建一个导出对象,如引用\[2\]中的BasicSysUserExcelData类。在该类中,您可以使用@ExcelProperty注解来指定每个字段在Excel中的列名。接下来,您可以使用EasyExcel提供的工具类来进行导出操作。以下是一个简单的示例代码: ```java // 创建导出数据列表 List<BasicSysUserExcelData> dataList = new ArrayList<>(); // 添加数据到列表中 // 设置导出的文件路径和文件名 String filePath = "path/to/exported/file.xlsx"; // 执行导出操作 EasyExcel.write(filePath, BasicSysUserExcelData.class).sheet("Sheet1").doWrite(dataList); ``` 在上述代码中,您需要将数据添加到dataList中,并指定导出的文件路径和文件名。然后,使用EasyExcel.write()方法指定导出的文件和数据类型,并使用.sheet()方法指定导出的Sheet名称。最后,使用.doWrite()方法执行导出操作。 完成导出后,您可以将生成的Excel文件提供给用户进行下载。用户可以通过点击下载链接或使用其他方式下载该文件。 请注意,上述代码只是一个简单的示例,您可能需要根据您的具体需求进行适当的修改和扩展。 #### 引用[.reference_title] - *1* *2* [EasyExcel导出excel表格](https://blog.csdn.net/LF15527554599/article/details/123925722)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

入夏忆梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值