EasyExcel动态导出多个sheet的自定义excel模板
一.导出Excel ①header头部数据格式:
//key为excel表的sheet名称,value为对应sheet的头部数据 Map<String, List<?>> map = new HashMap<>();
②data表格数据:
//填充进excel的数据 List<?> dataList;
③下载表格:
/**
* 多个sheet模板下载
*
* @param response
* @throws IOException
*/
public void downloadMultiSheet(HttpServletResponse response) throws IOException {
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
String fileName = URLEncoder.encode(downloadName, "UTF-8");
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
ExcelWriter excelWriter = null;
excelWriter = genTemplateMultiSheet(response);
//切记一定要关闭才能完成下载
excelWriter.finish();
}
/**
* 填充多个sheet模板数据
*
* @param response
*/
private ExcelWriter genTemplateMultiSheet(HttpServletResponse response) throws IOException {
XSSFWorkbook workbook = new XSSFWorkbook(FormTemplateGenExcel.class.getResourceAsStream(templateName));
ByteArrayOutputStream bos = new ByteArrayOutputStream();
//根据传入的map新建多个sheet并设置name
int j = 0;
for (Map.Entry<String, List<Json>> entry : multiSheetHeaderMap.entrySet()) {
if (j == 0) {
//首先设置第一个sheet的名称
workbook.setSheetName(j, entry.getKey());
j++;
continue;
}
//循环克隆模板第一个sheet,修改为其他名称
workbook.cloneSheet(0, entry.getKey());
}
//重新构建新的输入流
workbook.write(bos);
byte[] bArray = bos.toByteArray();
InputStream is = new ByteArrayInputStream(bArray);
//创建新的excelWriter
ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).withTemplate(is).build();
//将map数据分页填充头部和监测值
FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.HORIZONTAL).build();
for (Map.Entry<String, List<Json>> entry : multiSheetHeaderMap.entrySet()) {
WriteSheet writeSheet = EasyExcel.writerSheet(entry.getKey()).registerWriteHandler(new ExcelWidthStyleStrategy()).build();
//excel模板中自定义设置的头部字段
excelWriter.fill(new FillWrapper("item", entry.getValue()), fillConfig, writeSheet);
//excel模板中自定义设置的数据字段
excelWriter.fill(new FillWrapper("data", dataList), writeSheet);
}
return excelWriter;
}
自定义的excel模板:
下一篇:
JS正则表达式匹配手机号
