EasyExcel导出带下拉框,并解决导出之后打开总是显示发现不可读取内容

摘要:
参考了这位大佬的代码:https://blog.csdn.net/qq_42747210/article/details/113063645主要原因是:excel本身每个单元格限制了255个字符,下拉框总字符超过255就无法正常打开因为我有多列需要下拉框,所有用Map来装数据,key为需要下拉框的列,value为该列下拉框的值;我只是设置了序号为1到50的行需要下拉框;importjava.uti

参考了这位大佬的代码:https://blog.csdn.net/qq_42747210/article/details/113063645

主要原因是:excel本身每个单元格限制了255个字符,下拉框总字符超过255就无法正常打开

EasyExcel导出带下拉框,并解决导出之后打开总是显示发现不可读取内容第1张

因为我有多列需要下拉框,所有用Map来装数据,key为需要下拉框的列,value为该列下拉框的值;我只是设置了序号为1到50的行需要下拉框;

importjava.util.Map;

importorg.apache.poi.ss.usermodel.DataValidation;
importorg.apache.poi.ss.usermodel.DataValidationConstraint;
importorg.apache.poi.ss.usermodel.DataValidationHelper;
importorg.apache.poi.ss.usermodel.Name;
importorg.apache.poi.ss.usermodel.Sheet;
importorg.apache.poi.ss.usermodel.Workbook;
importorg.apache.poi.ss.util.CellRangeAddressList;

importcom.alibaba.excel.write.handler.SheetWriteHandler;
importcom.alibaba.excel.write.metadata.holder.WriteSheetHolder;
importcom.alibaba.excel.write.metadata.holder.WriteWorkbookHolder;

public class CustomSheetWriteHandler implementsSheetWriteHandler {

    private Map<Integer, String[]>map;

    private intindex;

    public CustomSheetWriteHandler(Map<Integer, String[]>map) {
        this.map =map;
        this.index = 0;
    }

    @Override
    public voidbeforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
        //TODO Auto-generated method stub
}

    @Override
    public voidafterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {

        DataValidationHelper helper =writeSheetHolder.getSheet().getDataValidationHelper();

        //k 为存在下拉数据集的单元格下表 v为下拉数据集
        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, 50, 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()).head(outDto.getHeadList())
                .registerWriteHandler(new CustomSheetWriteHandler(map)).registerWriteHandler(newCustemhandler())
                .sheet("导出模板").doWrite(outDto.getDataList());

免责声明:文章转载自《EasyExcel导出带下拉框,并解决导出之后打开总是显示发现不可读取内容》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇webService 服务端搭建c#远程连接oracle(本地无oracle客户端)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

微信小程序手动实现select下拉框选择

在小程序中没有像h5中的下拉 标签的 picker又满足部了,那就自己动手写 <view class='list-msg'> <view class='list-msg1'> <text>商品金额</text> <text>¥99.00</text&g...

可搜索的下拉框

<template> <a-select show-search placeholder="Select a person" option-filter-prop="children"(这个好像不用也行) :filter-option="filterOption" @focus="h...

.net使用layui框架下。绑定搜索下拉框-模糊查询

网上找了些,没一个全的,自己总结了下 页面部分: <select lay-search> </select> JS部分: $(funct...

element-ui下拉框在ios上点两次才能选中?????

解决办法,在app.vue中加入如下样式(scss) .el-scrollbar { //element-ui 下拉框在ios上 点击两次才能选中 > .el-scrollbar__bar { opacity: 1 !important; } } 。...

【转】文本框(Textbox)和下拉框(Combobox)自动联想功能的实现

看见一大侠介绍这种联想的效果,很棒! 怎样使自己程序中的文本框或下拉框具有像百度和Google那样的自动联想功能?微软的TextBox和Combobox控件为我们提供了简便方法。 首先需要学习TextBox(或Combobox)的两个属性,一个属性是AutoCompleteMode,指定控件中使用的自动完成功能的模式,有四种模式,分别是: None:禁用控...

selenium select下拉选择框定位处理的两种方式

一、前言      总结一下python+selenium select下拉选择框定位处理的两种方式,以备后续使用时查询; 二、直接定位(XPath) 使用Firebug找到需要定位到的元素,直接右键复制XPath,使用find_element_by_xpath定位; driver = webdriver.Firefox() driver.get("htt...