写这个还是自己刚刚写完这个功能,网上很多的动态生成表头很令我上头,说是说动态生成表头,结果是动态生成数据,但是天无绝人之路啊!我调整过的代码起源来自这篇博客 大佬的博客

我的部分基本的来源于大佬的这篇博客,一部分是我自己弄的,以下就是献丑现场:
ps.我用的是mybatis plus 我会把这部分弄好注释,大概知道是什么就行,以下的代码是你创建excel所以不需要用到eazypoi的对象表格。那种方法在这个场景不行,所以各位不用创建excel对象了。

//mybatis plus部分,这里是查询我待会要执行的for循环
        QueryWrapper<Organization> wrapper =new QueryWrapper<>();
        wrapper.eq("sales",true);
        List<Organization> organizations = organizationService.list(wrapper);
       //结束
       
        //创建excel对象
        List<ExcelExportEntity> colList = new ArrayList<ExcelExportEntity>();
        //固定的列
        //表头的title和key,key要求唯一,title是你这一列的名称
        ExcelExportEntity excelExportEntity =new ExcelExportEntity("日期", "day");
        //是否合并
        excelExportEntity.setNeedMerge(true);
        //设置序号
        excelExportEntity.setOrderNum(0);
        //加入list
        colList.add(excelExportEntity);

        //动态的列,上面的循环
        if(!CollectionUtils.isEmpty(organizations)){
            for(int i=0;i<organizations.size();i++){
               //这里是一个表头下带着两个表头
               //主表头
                ExcelExportEntity deliColGroup = new ExcelExportEntity(organizations.get(i).getName()+".客户", "visitor"+i);
                //存放两个表头
                List<ExcelExportEntity> deliColList = new ArrayList<>();
                //子表头1
                ExcelExportEntity excelExportEntityc =new ExcelExportEntity("批次", "count"+i);
                //这个方法是最后一列的合计,我的功能主要都是数字,所以需要合计
                excelExportEntityc.setStatistics(true);
                //放入list
                deliColList.add(excelExportEntityc);
                //子表头2,以下同上
                ExcelExportEntity excelExportEntityn =new ExcelExportEntity("人数", "numbers"+i);
                excelExportEntityn.setStatistics(true);
                deliColList.add(excelExportEntityn);
                deliColGroup.setList(deliColList);
                colList.add(deliColGroup);
//
            }
        }
        //固定的列
        //也是统计,横向统计
        ExcelExportEntity sumEntity =new ExcelExportEntity("总批次", "sumCount");
        sumEntity.setStatistics(true);
        colList.add(sumEntity);
         //还是统计,横向统计
        ExcelExportEntity sum2Entity =new ExcelExportEntity("总人数", "sumNumber");
        sum2Entity.setStatistics(true);
        colList.add(sum2Entity);

//以下的内容可调整,扣代码的同学大概仿照就好,照搬应该有错,毕竟不同的场景不同的应用,我主要讲一下思路:

 1. 有一个List存放map集合
 2. map里面的key是上面 ExcelExportEntity创建时的key  
 例如:    ExcelExportEntity sumEntity =new ExcelExportEntity("总批次", "sumCount");中的sumCount
 3.通过for循环添加list下的map集合
 4.动态的列也是for循环嵌套
 5.第一个循环时循环最外层的list

List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
//查询结果
        List<MonReportVO> monReportVOList = mapper.selectByTeamId(condition.toMap());
        if (!CollectionUtils.isEmpty(monReportVOList)){
            //循环行
            for(int i=0;i<monReportVOList.size();i++){
                Map<String, Object> valMap = new HashMap<String, Object>();
                valMap.put("day",monReportVOList.get(i).getVisitingTime());
                int a=0,b=0;
                //动态列循环
                //主表头内容不为空
                if (!CollectionUtils.isEmpty(organizations)){
                    //循环主表头
                    for(int j=0;j<organizations.size();j++){
                        List<Map<String, Object>> deliDetailList = new ArrayList<Map<String, Object>>();
                        //查询到的结果
                        List<MonReportVO> monReportVOLists = mapper.selectBySome(condition.toMap());
                        if(!CollectionUtils.isEmpty(monReportVOLists)){
                        //循环子表头内容
                            for(int m=0; m<monReportVOLists.size();m++){
                                Map<String, Object> deliValMap = new HashMap<>();
                                deliValMap.put("count"+j, monReportVOLists.get(m).getCount());
                                deliValMap.put("numbers"+j, monReportVOLists.get(m).getNumbers());
                                deliDetailList.add(deliValMap);
                                a += Integer.parseInt( monReportVOLists.get(m).getCount());
                                b += Integer.parseInt(monReportVOLists.get(m).getNumbers());
                            }
                        }else {
                        //为空的情况
                            Map<String, Object> deliValMap = new HashMap<>();
                            deliValMap.put("count"+j, 0);
                            deliValMap.put("numbers"+j, 0);
                            deliDetailList.add(deliValMap);
                        }
                        valMap.put("visitor"+j, deliDetailList);
                    }
                }
                }
                //统计的那两行
                valMap.put("sumCount",a);
                valMap.put("sumNumber",b);
                list.add(valMap);
            }

        }

控制层的部分代码:

//ExcelExportUtil.exportExcel是eazypoi自带的方法,具体大家使用的时候可以看下源码内容,很简单,
colList是之前第一段创建表头的部分集合,list是你加入的数据集合。

try后面的代码可以直接扣,因为我是把eazypoi的源码里面的下载部分扣过来了。要改的部分也就是xxx.xls部分,
取名字而已,我相信大家可以的。

Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("月报表", "数据"), colList,list);
            try {
                response.setCharacterEncoding("UTF-8");
                response.setHeader("content-Type", "application/vnd.ms-excel");
                response.setHeader("Content-Disposition",
                        "attachment;filename=" + URLEncoder.encode("xxx.xls", "UTF-8"));
                workbook.write(response.getOutputStream());
            } catch (IOException e) {
                throw new Exceptions.PoiException(e.getMessage());
            }