首页 > 其他分享 >easyexcel动态下拉框,动态表头

easyexcel动态下拉框,动态表头

时间:2023-04-05 19:35:26浏览次数:29  
标签:String split0 int List 表头 new 动态 下拉框

private static final int FLAG1 = 1;
private static final int FLAG2 = 2;
private static final int FLAG3 = 3;

/**
 * 动态列头
 *
 * @return
 */
private List<List<String>> head(Integer headFlag) {
    List<User> userList = new ArrayList<>();
    int size = userList.size();
    String fields[] = new String[size];
    for (int i = 0; i < userList.size(); i++) {
        String name = userList.get(i).getName();
        fields[i] = name;
    }
    List<String> strings = Arrays.asList(fields);
    ArrayList<String> heads = new ArrayList<>();
    heads.addAll(strings);
    //不同头标记额外不同的列头
    switch (headFlag) {
        case 1:
            heads.add("xxxx");
            break;
        case 2:
            heads.add("xxxx");
            break;
        case 3:
            heads.add("xxxx");
            break;
    }
    List<List<String>> headList = new ArrayList<List<String>>();
    int length = heads.size();
    for (int i = 0; i < length; i++) {
        List<String> list = new ArrayList<>();
        list.add(heads.get(i));
        headList.add(list);
    }
    return headList;
}

/**
 * 动态猎头要写出的数据
 *
 * @param users
 * @param headFlag   FLAG1  FLAG2  FLAG3
 * @return
 */
private List<List<Object>> dataList(List<User> users, Integer headFlag) {
    List<List<Object>> list = new ArrayList<List<Object>>();
    if (!ObjectUtils.isEmpty(users)) {
        users.forEach(archive -> {
            List<Object> data = new ArrayList<Object>();
            data.add(archive.getAge());
            //不同类型的表头要写的数据
            if (FLAG1 == headFlag) {
                data.add("xxxxxx");
            }

            if (FLAG2 == headFlag) {
                data.add("xxxxxx");
            }

            if (FLAG3 == headFlag) {
                data.add("xxxxxx");
            }
            list.add(data);
        });
    }
    return list;
}

/**
 * 实际写出的数据
 * key:  FLAG1  FLAG2  FLAG3
 * value:  对应的数据
 */
public void handelExcelWriteData() {
    //实际要写出的数据
    List<User> waitUserList = new ArrayList<>();
    List<User> userDateList = new ArrayList<>();
    List<User> noUserList = new ArrayList<>();

    Map<List<List<String>>, List<User>> hashMap1 = new HashMap<>();
    Map<List<List<String>>, List<User>> hashMap2 = new HashMap<>();
    Map<List<List<String>>, List<User>> hashMap3 = new HashMap<>();

    List<List<String>> head1 = head(FLAG1);
    hashMap1.put(head1, waitUserList);

    List<List<String>> head2 = head(FLAG2);
    hashMap2.put(head2, userDateList);

    List<List<String>> head3 = head(FLAG3);
    hashMap3.put(head3, noUserList);

    Map<Integer, Map<List<List<String>>, List<User>>> dataListMap = new HashMap();
    //不同类型对应的数据
    dataListMap.put(FLAG1, hashMap1);
    dataListMap.put(FLAG2, hashMap2);
    dataListMap.put(FLAG3, hashMap3);
    this.handelExcelData(dataListMap);
}


/**
 * 处理excel数据
 * @param dataListMap
 */
private void handelExcelData(Map<Integer, Map<List<List<String>>, List<User>>> dataListMap) {
    String path = "实际要导出的路径";
    try {
        File parentFile = new File(path);
        if (!parentFile.exists()) {
            parentFile.mkdirs();
            parentFile.createNewFile();
        }
        String[] split0 = new String[0];//选择下拉框 TODO 根据实际情况去做下列数据
        String[] split1 = new String[0];//选择下拉框 TODO  根据实际情况去做下列数据


        ExcelWriter excelWriter = EasyExcel.write(path).build();
        Iterator<Map.Entry<Integer, Map<List<List<String>>, List<User>>>> iterator = dataListMap.entrySet().iterator();
        while (iterator.hasNext()) {
            Map.Entry<Integer, Map<List<List<String>>, List<User>>> next = iterator.next();
            //key  FLAG1 FLAG2 FLAG3
            Integer key = next.getKey();
            if (key == FLAG1) {
                this.writeExcel(next, FLAG1, excelWriter, split0, split1);
            } else if (key == FLAG2) {
                this.writeExcel(next, FLAG2, excelWriter, split0, split1);
            } else if (key == FLAG3) {
                this.writeExcel(next, FLAG3, excelWriter, split0, split1);
            }
        }
        excelWriter.finish();

    } catch (Exception e) {
        //异常写出空文件
        ExcelWriter excelWriter = EasyExcel.write(path).build();
        WriteSheet writeSheet = EasyExcel.writerSheet(0).sheetName("sheet" + 0)
                .build();
        excelWriter.write(new ArrayList<>(), writeSheet);
        excelWriter.finish();

    }
}

/**
 *
 * @param next  实际数据
 * @param controlHeadFlag
 * @param excelWriter
 * @param split0
 * @param split1
 */
private void writeExcel(Map.Entry<Integer, Map<List<List<String>>, List<User>>> next,
                        Integer controlHeadFlag, ExcelWriter excelWriter, String[] split0,
                        String[] split1) {
    Map<List<List<String>>, List<User>> value = next.getValue();
    Iterator<Map.Entry<List<List<String>>, List<User>>> iterator1 = value.entrySet().iterator();
    //里面只有一个
    while (iterator1.hasNext()) {
        Map.Entry<List<List<String>>, List<User>> next1 = iterator1.next();
        //动态要写出的数据
        List<User> value1 = next1.getValue();
        if (!CollectionUtils.isEmpty(value1)) {
            //行号(有多少数据就有多少行)
            int row = value1.size();
            //动态列头
            List<List<String>> key1 = next1.getKey();
            //列号(其实就是下拉框在第几列)
            int raw = key1.size();
            List<List<Object>> lists = this.dataList(value1, controlHeadFlag);
            WriteSheet writeSheet = EasyExcel.writerSheet(controlHeadFlag - 1).sheetName("sheet" + controlHeadFlag)
                    .head(key1)
                    .registerWriteHandler(new SpinnerWriteHandler(split0, split1, row, raw))
                    .build();
            excelWriter.write(lists, writeSheet);
        }
    }
}
/**
 * 下拉监听
 * 动态下拉框输出处理
 */
@Slf4j
public class SpinnerWriteHandler implements SheetWriteHandler {


    //     下拉框数组
    private String[] split0;

    //     下拉框数组
    private String[] split1;
    //行
    private Integer row;
    //列
    private Integer raw;

    Map<Integer, String> staticMap = new HashMap();

    {
        staticMap.put(1, "XXXXXX");//新建的sheet用于存放下拉框内的数据,
        staticMap.put(2, "XXXXXX");
    }


    public SpinnerWriteHandler(String[] split0, String[] split1, Integer row, Integer raw) {
        this.split0 = split0;
        this.split1 = split1;
        this.row = row;
        this.raw = raw;
    }

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

    @Override
    public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
//        //设置下拉框数据
        Map<Integer, String[]> map = new HashMap<>();
        //这里时两列相邻的下拉框
        map.put(raw - 1, this.split0); //动态列号
        map.put(raw - 2, this.split1);//动态列号
        //动态解决单个单元格下拉框超过255字符
        log.info("第{}个Sheet写入成功。", writeSheetHolder.getSheetNo());
        DataValidationHelper helper = writeSheetHolder.getSheet().getDataValidationHelper();

        int flag = 0;
        // 省市下拉框
        for (Map.Entry<Integer, String[]> entry : map.entrySet()) {
            ++flag;
            // 创建sheet,突破下拉框255的限制
            //获取一个workbook
            Workbook workbook = writeWorkbookHolder.getWorkbook();
            //定义sheet的名称
            String sheetName = staticMap.get(flag);
            //1.创建一个隐藏的sheet
            Name name = workbook.getName(sheetName);
            String[] value = entry.getValue();
            if (!ObjectUtils.isEmpty(value)) {
                if (ObjectUtils.isEmpty(name)) {
                    Sheet sheet = workbook.createSheet(sheetName);
                    Name category1Name = workbook.createName();
                    category1Name.setNameName(sheetName);
                    int length1 = entry.getValue().length;
                    for (int i = 0, length = length1; i < length; i++) {
                        // i:表示你开始的行数  0表示你开始的列数
                        sheet.createRow(i).createCell(0).setCellValue(value[i]);
                    }
                    if (!ObjectUtils.isEmpty(value)) {
                        //从被创建的sheet第一个单元格开始向下填充  填充到实际数据长度【value.length的行号】
                        category1Name.setRefersToFormula(sheetName + "!$A$1:$A$" + (value.length));
                        // sheet设置隐藏
                        workbook.setSheetHidden(workbook.getSheetIndex(sheetName), true);
                    }

                } else {
                    Name category1Name = workbook.getName(sheetName);
                    Sheet sheet1 = workbook.getSheet(sheetName);
                    int length1 = entry.getValue().length;
                    for (int i = 0, length = length1; i < length; i++) {
                        // i:表示你开始的行数  0表示你开始的列数
                        sheet1.createRow(i).createCell(0).setCellValue(value[i]);
                    }
                    if (!ObjectUtils.isEmpty(value)) {
                        category1Name.setRefersToFormula(sheetName + "!$A$1:$A$" + (value.length));
                    }
                }

                                                                                    //从第一行填充至row行(包含),第 entry.getKey() 列至entry.getKey()列【因为只填充一个单元格,所以起始一致】
                CellRangeAddressList addressList = new CellRangeAddressList(1, row, entry.getKey(), entry.getKey());
                DataValidationConstraint constraint8 = helper.createFormulaListConstraint(sheetName);
                DataValidation dataValidation3 = helper.createValidation(constraint8, addressList);
                writeSheetHolder.getSheet().addValidationData(dataValidation3);
                //处理Excel兼容性问题
                if (dataValidation3 instanceof XSSFDataValidation) {
                    dataValidation3.setSuppressDropDownArrow(true);
                    dataValidation3.setShowErrorBox(true);
                } else {
                    dataValidation3.setSuppressDropDownArrow(false);
                }
                Sheet sheet0 = writeSheetHolder.getSheet();
                //5 将刚才设置的sheet引用到你的下拉列表中
                sheet0.addValidationData(dataValidation3);
            }

        }
    }
}

 

标签:String,split0,int,List,表头,new,动态,下拉框
From: https://www.cnblogs.com/wangbiaohistory/p/17290649.html

相关文章

  • 动态内存管理——动态内存函数
    动态内存管理,也叫动态内存分配,顾名思义:动态的来分配内存。1.为什么存在动态内存分配我们已经知道的内存分配方式有:创建一个变量:整型,分配4个字节的空间;长整型;分配8个字节的空间,又或者创建一个数组,创建一个函数的形参........但是,这些开辟空间的方式都有两个特点:1.空间大小固定; 2.......
  • HJ103 Redraiment的走法(梅花桩递增可走的最多步数)_排序_动态规划
    思路:该题目符合,最优结果拥有最优子结果的特征。考虑用动态规划。通过循环获取每个参数作为最后一个桩的最优子结果,后面桩的结果为前一个桩的最优子结果+1。如梅花桩“251545”。参考高赞答案,代码如下1importsys2a=int(sys.stdin.readline().strip())3b=list(map(......
  • ROS动态调试PID参数
    ROS动态调试PID参数连接小车注意:必须在同一区域网sshclbrobort@clbrobort激活树莓派主板roslaunchclbrobotbringup.launch打开PID重新打开一个终端输入:sshclbrobot@iprosrunriki_Pidpid_configure打开控制器重新打开终端输入:rosrunrqt_reconfigurerqt_reco......
  • python 变量动态命名,赋值和调用
    变量动态命名foriinrange(3):exec("变量{}".format(i))变量动态赋值foriinrange(3):exec("变量{}={}*2".format(i,i))动态变量调用eval()执行完会返回结果,而exec()执行完不返回结果(http://c.biancheng.net/view/5683.html)a=1exec("a=2")#相当于直接执......
  • 【翻译】动态包加载
    原文:《DynamicPackageLoading》SenchaCmd一直以来都支持包的概念,大型应用程序可通过包来封装类、样式和资源,然后通过SenchaCmd将这些包打包到应用程序中。现在,又有了权限的方式(动态)来使用这些包。如果现在已经使用了包,那会在应用程序的app.json文件中看到类似于以下的“require......
  • 算法问题——动态规划和回溯算法问题
    回溯算法树形问题排列问题组合问题二位平面的回溯算法回溯递归问题树形问题17.电话号码的字母组合(全排列的问题)/***Copyright(C),2018-2020*FileName:letterCombinations*Author:xjl*Date:2020/3/2015:30*Description:给定一个仅包含数字2-9的字......
  • 算法训练——剑指offer(动态规划算法)摘要
    摘要一、动态规划原理与解题方法二、动态规划算法练习题目2.1跳台阶问题package动态规划算法;importorg.junit.Test;/***@ClassnameJZ69跳台阶问题*@DescriptionTODO*@Date2022/2/1118:54*@Createdbyxjl*/publicclassJZ69跳台阶问题{/**......
  • http信息头管理器-动态参数化
     5000个用户,需要用5000个不同的id  解决办法菜单栏--函数助手--random分别填写最小值,最大值点击“生成”,则默认复制直接去变量值的位置粘贴即可  - ......
  • 模拟mybatis接口动态注册过程
    思考  前文提到2种方式动态加载bean到容器,这里我们模拟一下mybatis手动注册Bean到容器的过程。模拟有啥好处,主要是为了方便你理解如何手动注册Bean的过程及mybatis的设计思想。毕竟这个才是spring的核心内容。    首先思考一下问题    如果你实现这个问题,你准备怎......
  • vue下拉框联动 数据清空后,赋值无效
     1.问题描述:规格型号与设备类型联动,当选择“规格型号”后,清空“设备类型”选择框内容,选择数据赋值时失效。   2.解决 添加this.$forceUpdate();进行强制渲染,效果实现。 getSecondName(){   this.$forceUpdate();  }, ......