核心逻辑是多次写入ZipOutputStream
private void exportZip(LocalDate startDt, LocalDate endDt, HttpServletResponse response) throws IOException {
// 这里URLEncoder.encode可以防止中文乱码
String zipFileName = URLEncoder.encode("收费汇总表 - 多日汇总", "UTF-8").replaceAll("\\+", "%20");
response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + zipFileName + ".zip");
response.setContentType("application/x-msdownload");
response.setCharacterEncoding("utf-8");
String templateFileName = FileUtil.getPath() + "template/收费汇总表模板.xlsx";
templateFileName = URLDecoder.decode(templateFileName, "UTF-8").replaceAll("\\+", "%20");
//开始存入
try (ZipOutputStream zipOut = new ZipOutputStream(response.getOutputStream())) {
while (!startDt.isAfter(endDt)) {
List<BillSummary> billSummaryList = frDetailCheckService.getSummaryExcelData(startDt);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ExcelWriter excelWriter = EasyExcel
.write(outputStream)
.withTemplate(templateFileName)
.build();
zipOut.putNextEntry(new ZipEntry(String.format("收费汇总表(%s).xlsx", DateUtil.formatLocalDate(startDt))));
//开始写入excel
WriteSheet writeSheet = EasyExcel.writerSheet().build();
FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
excelWriter.fill(billSummaryList, fillConfig, writeSheet);
excelWriter.fill(Maps.newHashMap("tradeDate", DateUtil.formatLocalDate(startDt)), fillConfig, writeSheet);
excelWriter.finish();
outputStream.writeTo(zipOut);
zipOut.closeEntry();
startDt = startDt.plusDays(1);
}
} catch (Exception e) {
// 重置response
response.reset();
response.setContentType("application/json");
response.setCharacterEncoding("utf-8");
response.getWriter().println("下载文件失败" + e.getMessage());
}
}
private void exportOne(LocalDate tradeDate, HttpServletResponse response) throws IOException {
try {
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding("utf-8");
// 这里URLEncoder.encode可以防止中文乱码
String fileName = URLEncoder.encode("收费汇总表", "UTF-8").replaceAll("\\+", "%20");
response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
// 这里需要设置不关闭流
String templateFileName = FileUtil.getPath() + "template/收费汇总表模板.xlsx";
templateFileName = URLDecoder.decode(templateFileName, "UTF-8").replaceAll("\\+", "%20");
List<BillSummary> list = frDetailCheckService.getSummaryExcelData(tradeDate);
ExcelWriter excelWriter = EasyExcel
.write(response.getOutputStream())
.withTemplate(templateFileName)
.build();
WriteSheet writeSheet = EasyExcel.writerSheet().build();
FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
excelWriter.fill(Maps.newHashMap("tradeDate", DateUtil.formatLocalDate(tradeDate)), fillConfig, writeSheet);
excelWriter.fill(list, fillConfig, writeSheet);
excelWriter.finish();
} catch (Exception e) {
// 重置response
response.reset();
response.setContentType("application/json");
response.setCharacterEncoding("utf-8");
response.getWriter().println("下载文件失败" + e.getMessage());
}
}