写这个还是自己刚刚写完这个功能,网上很多的动态生成表头很令我上头,说是说动态生成表头,结果是动态生成数据,但是天无绝人之路啊!我调整过的代码起源来自这篇博客 大佬的博客
我的部分基本的来源于大佬的这篇博客,一部分是我自己弄的,以下就是献丑现场:
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());
}