问题背景:
需要动态的生成自定义的多级表头
解决:
如果是表头能够一开始定义好的,那么使用easyexcl官网中的快速开始->写excl->复杂头写入就可以了,只需要一开始定义一个excel对应的实体对象,文档链接如下:https://easyexcel.opensource.alibaba.com/docs/current/quickstart/write#%E5%A4%8D%E6%9D%82%E5%A4%B4%E5%86%99%E5%85%A5
但是我这里的需求,表头不是固定的,要动态生生成,解决代码如下:
表头代码
创建多级表头并合并空白行。
easyexcl默认的合并规则是:相邻的行或列如果同名就会合并,这个可以自己写自定义规则,我这里需求已经满足了。有的列是两行,有的列是三行甚至更多,我这里的解决方法是先找出表头的最高层级,对每一列的数据,追加同名行到最高层级,这样就实现了合并单元格。
注意:顺序很重要
List<List<String>> head;
head.add(fillHraderList(Arrays.asList("上月门店执行情况", "铺货门店标记"), maxLevel));
head.add(fillHraderList(Arrays.asList("上月门店执行情况", "冰冻化", "我司冰柜", "陈列规格"), maxLevel));
head.add(fillHraderList(Arrays.asList("上月门店执行情况", "冰冻化", "我司冰柜", "费用"), maxLevel));
head.add(fillHraderList(Arrays.asList("上月门店执行情况", "冰冻化", "非自有冰柜", "陈列规格"), maxLevel));
head.add(fillHraderList(Arrays.asList("上月门店执行情况", "冰冻化", "非自有冰柜", "陈列位置"), maxLevel));
head.add(fillHraderList(Arrays.asList("上月门店执行情况", "冰冻化", "非自有冰柜", "费用"), maxLevel));
private List<String> fillHraderList(List<String> list, int maxLevel) {
List<String> result = new ArrayList<>(list);
String lastElement = list.get(list.size() - 1);
while (result.size() < maxLevel) {
result.add(lastElement);
}
return result;
}
效果图:
表体数据填充代码
注意:顺序很重要,完全是根据列的顺序填充对应的值
// Map的key、value对应列下标,列值
List<Map<Integer, String>> dataList;
dataList.forEach(data -> {
// 判断列是否有值
if (columnMap.containsKey(refBusinessPlanTemplateColumn)) {
data.put(columnMap.get(refBusinessPlanTemplateColumn), item.getColumnValue());
}else{
data.put(columnMap.get(refBusinessPlanTemplateColumn),"");
}
});
// 写入excl
ByteArrayOutputStream excelOut = new ByteArrayOutputStream();
ExcelWriter excelWriter = EasyExcel.write().file(excelOut).build();
WriteSheet writeSheet0 = EasyExcel.writerSheet(0).head(head).build();
excelWriter.write(dataList, writeSheet0);
excelWriter.finish();