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");
}
}