java 动态生成多个excel(xlsxlsx)文件打成zip包供用户下载

时间:2024-05-22 21:22:29

 

        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格式的:正常导出

 

java 动态生成多个excel(xls\xlsx)文件打成zip包供用户下载

xlsx格式:只导出了一个

java 动态生成多个excel(xls\xlsx)文件打成zip包供用户下载

原因:代码中下划线部分  XSSFWorkbook对象调用 write方法传去MemoryStream对象后,会自动关闭传入的参数。

java 动态生成多个excel(xls\xlsx)文件打成zip包供用户下载

WorkBook有三个实现类  查看源码时发现  其中HSSFWorkBook中的write方法不会关闭流  但是SXSSFWorkBook和XSSFWorkBook都会关闭流 所以导致只能导出一个xlsx文件

解决办法:

java 动态生成多个excel(xls\xlsx)文件打成zip包供用户下载

不是用workbook的write方法 而是是将字节流写入zip中

ps:找了一天  实在是不知道如何使用workbook.write(zo) 成功导出多个xlsx的zip文件。所以就换了个思路。有朋友知道如何使用workbook.write(zo)的话 可以@我