(解決)easypoi模板導出多個excel文件並壓縮

  • 2021 年 1 月 14 日
  • 筆記

easypoi版本——3.1.0

實現程式碼

public void export(HttpServletResponse response, HttpServletRequest request, ModelMap modelMap) {
    try {
        String fileName = "批量導出.zip";
        response.setContentType("application/octet-stream ");
        response.setHeader("Connection", "close"); // 表示不能用瀏覽器直接打開
        response.setHeader("Accept-Ranges", "bytes");// 告訴客戶端允許斷點續傳多執行緒連接下載
        response.setHeader("Content-Disposition",
                    "attachment;filename=" + new String(fileName.getBytes("GB2312"), "ISO8859-1"));
        response.setCharacterEncoding("UTF-8");

        OutputStream out = response.getOutputStream();
        ZipOutputStream zos = new ZipOutputStream(out);

        //讀取路徑下的模板
        TemplateExportParams params = new TemplateExportParams("導出模板.xlsx");
        //獲取業務數據邏輯
        List<HashMap<String, Object>> exportList = new ArrayList<>();

        //循環導出
        for (HashMap<String, Object> map : exportList) {
            //導出的文件名稱
            String entryName = (String) map.get("title") + ".xlsx";
            ZipEntry entry = new ZipEntry(entryName);
            //easypoi導出excel文件
            Workbook workbook = ExcelExportUtil.exportExcel(params, map);
            //編寫新的zip條目,並將流定位到條目數據的開頭
            zos.putNextEntry(entry);
            //workBook.write會指定關閉數據流,直接用workbook.write(zos),下次就會拋出zos已被關閉的異常,所以用ByteArrayOutputStream來拷貝一下。
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            //workbook寫入bos
            workbook.write(bos);
            //bos寫入zos
            bos.writeTo(zos);
            zos.closeEntry();
        }
        if(zos != null) {
            zos.flush();
            zos.close();
        }
    }
    catch (Exception e) {
        e.printStackTrace();
    }
}

後語

希望上述程式碼能對你有用。

Tags: