Java中导出Excel导出多个sheet页
- 序言
- 如何处理多个sheet页的导出
- 期间遇到了一个sheet页相关的问题,以及解决办法
- 多sheet页导出遇到,第二个sheet页的标题名称会把第一个的覆盖的问题
- 结语
序言
在日常工作中经常有导出数据文件的需求,避免不了会有导出多个sheet页的功能,这里给大家分享一个自己使用过的方法。
如何处理多个sheet页的导出
下面是导出的方法代码,用到的参数基本就是两个对应的数据集合,两个数据的标题(这个根据自己需求来,可以不用),excel文件名称,以及两个sheet页的名称。
public static void exportExcelPlus1(HttpServletResponse response,List<?> list,List<?> list1,String title,String title1,String fileName,String sheetName,String sheetName1){
if (CollUtil.isEmpty(list)) {
throw new SystemNoLogException(ResponseCode.EXCEL_EXPORT_FAILED, "无数据可导出");
}
Class<?> clazz = list.get(0).getClass();
Class<?> clazz1 = list1.get(0).getClass();
if (StrUtil.isEmpty(fileName)) {
fileName = "Excel导出";
}
try {
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
String fileSuffix = new SimpleDateFormat("yyyyMMdd-HHmmss").format(new Date());
fileName = fileName.concat("_").concat(fileSuffix);
String excelName = URLEncoder.encode(fileName, "UTF-8");
response.setHeader("Content-disposition", "attachment;filename=" + excelName + ExcelTypeEnum.XLSX.getValue());
Field[] fields = clazz.getDeclaredFields();
List<Field> fieldList = Arrays.stream(fields).filter(item -> item.getAnnotation(ExcelProperty.class) != null).collect(Collectors.toList());
int cellCount = fieldList.size();
ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).excelType(ExcelTypeEnum.XLSX).build();
WriteSheet mainSheet = EasyExcel.writerSheet(0, sheetName).head(clazz)
.registerWriteHandler(new ExportExcelTitleWriteHandler(cellCount, title,0))
.registerWriteHandler(new ExportExcelHeadWriteHandler(1))
.registerWriteHandler(new HorizontalCellStyleStrategy(defaultHeadStyle(), defaultContentCellStyle()))
.sheetName(sheetName)
.useDefaultStyle(true)
.relativeHeadRowIndex(1)
.build();
excelWriter.write(list,mainSheet);
Field[] fields1 = clazz1.getDeclaredFields();
List<Field> fieldList1 = Arrays.stream(fields1).filter(item -> item.getAnnotation(ExcelProperty.class) != null).collect(Collectors.toList());
int cellCount1 = fieldList1.size();
WriteSheet dSheet = EasyExcel.writerSheet(1, sheetName1).head(clazz1)
.registerWriteHandler(new ExportExcelTitleWriteHandler(cellCount1, title1,1))
.registerWriteHandler(new ExportExcelHeadWriteHandler(1))
.registerWriteHandler(new HorizontalCellStyleStrategy(defaultHeadStyle(), defaultContentCellStyle()))
.sheetName(sheetName1)
.useDefaultStyle(true)
.relativeHeadRowIndex(1)
.build();
excelWriter.write(list1,dSheet);
excelWriter.finish();
} catch (Exception e) {
log.error("export excel error", e);
response.reset();
response.setContentType("application/json");
response.setCharacterEncoding("utf-8");
try {
String message = "下载文件失败" + e.getMessage();
RestResponse restResponse = RestResponse.build(ResponseCode.EXCEL_EXPORT_FAILED, message);
response.getWriter().println(JSON.toJSONString(restResponse));
} catch (IOException ioException) {
log.error("export excel error", ioException);
throw new SystemNoLogException(ResponseCode.EXCEL_EXPORT_FAILED, ioException.getMessage());
}
}
}
期间遇到了一个sheet页相关的问题,以及解决办法
多sheet页导出遇到,第二个sheet页的标题名称会把第一个的覆盖的问题
导出数据之后发现,第二个的标题名称覆盖了第一个的标题,去网上找到了对应的解决办法,就是给标题赋值的时候,后面加上对应的sheet页索引,这样就能指定每一个sheet页对应的标题名称,下图中红色框中最后的索引就对应了各自的sheet页,索引从0开始,大家可以根据自己需求更改。
结语
不是职业博主,只是记录自己用到的一些技术点或者问题相关的解决办法,以便于以后用到的时候查看,顺便分享,如果有无法解决问题可以留言,看到会及时回复。