response.setContentType("application/zip");
String encodedText = URLEncoder.encode(fileName + ".zip", "UTF-8");
response.addHeader("Content-Disposition", "attachment; filename=\"" + encodedText + "\"; filename*=UTF-8''" + encodedText);
ZipOutputStream zo = new ZipOutputStream(response.getOutputStream());
Workbook workbook = Poi4ExcelUtil.getWorkbook(new ByteArrayInputStream(caliber.getExcelTemplate()));
zo.setEncoding("GBK");
zo.putNextEntry(new ZipEntry("aaa.xlsx"));
workbook.write(zo);
出现的问题:当下载的为多个xls文件可以正常下载。下载为多个xlsx文件时则只下载了一个
如图:(导出文件分别都是两个)
xls格式的:正常导出
xlsx格式:只导出了一个
原因:代码中下划线部分 XSSFWorkbook对象调用 write方法传去MemoryStream对象后,会自动关闭传入的参数。
WorkBook有三个实现类 查看源码时发现 其中HSSFWorkBook中的write方法不会关闭流 但是SXSSFWorkBook和XSSFWorkBook都会关闭流 所以导致只能导出一个xlsx文件
解决办法:
不是用workbook的write方法 而是是将字节流写入zip中
ps:找了一天 实在是不知道如何使用workbook.write(zo) 成功导出多个xlsx的zip文件。所以就换了个思路。有朋友知道如何使用workbook.write(zo)的话 可以@我