1.需求
有些业务,需要导出excel的单张sheet中,导出多张表格,比如不同类型人员的工资进行小计再总计,简单示例如下
如果业务比较复杂,导出的字段数很多,那么用常规的POI导出,就要搞死了.但是easyexcel却能很简单的利用填充方法进行导出,做好模板,仅需提取业务数据就行.详见以下示例
2.设计模板excel文件
模板里,最关键的多表格填充,就是集合数据的前缀,如上图中的{tableA.str}的tableA,这个自主定义,自己能区分就行
3.接口层方法
@SneakyThrows
@RequestMapping("fillMultyTable")
public ResponseEntity<byte[]> fillMultyTable(HttpServletRequest req){
//设定需要填充到模板的数据
Map<String, String> map = new HashMap();
map.put("year","2022");
map.put("numA","3");
map.put("numB","4");
map.put("numC","7");
List<FillSimpleDTO> tableA = new ArrayList<>();
tableA.add(new FillSimpleDTO().setStr("老张").setNum(1));
tableA.add(new FillSimpleDTO().setStr("老李").setNum(2));
List<FillSimpleDTO> tableB = new ArrayList<>();
tableB.add(new FillSimpleDTO().setStr("老刘").setNum(4));
ClassPathResource classPathResource = new ClassPathResource("otherFiles/fillMultyTable.xlsx");
try(
ByteArrayOutputStream os = new ByteArrayOutputStream();
InputStream inputStream = classPathResource.getInputStream();
){
//如果你的模板有list,且list不是最后一行,下面还有数据需要填充 就必须设置 forceNewRow=true 但是这个就会把所有数据放到内存 会很耗内存
FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
ExcelWriter excelWriter = EasyExcel.write(os).withTemplate(inputStream).build();
WriteSheet writeSheet = EasyExcel.writerSheet().build();
excelWriter.fill(map,writeSheet);//填充map
//多表格填充
excelWriter.fill(new FillWrapper("tableA", tableA),fillConfig,writeSheet);
excelWriter.fill(new FillWrapper("tableB", tableB),fillConfig,writeSheet);
excelWriter.finish();//不要忘记执行这个方法,关闭流,执行后才能真正填充数据
byte[] bytes = os.toByteArray();
return FileTool.createResEntity(req,bytes,"导出.xlsx");
}
}