SpringBoot動態生成多個Excel文件以壓縮包.zip格式下載


前言
文件下載的場景很多(還不是需求豐富嘛~),那麼什麼是動態生成文件呢,就是用戶選擇文件內容,服務器端根據選擇的數據生成某個格式的文件然後下載到客戶端。單個碼直接下載,多個打包下載咯!

項目場景
項目中有個數據導出excel的需求,而且是批量,那麼就要打包咯

解決步驟
基本實現如下:

生成文件
保存到臨時目錄 || 緩存到內存中
將文件打包下載
我不想廢話了,上代碼:

直接把文件輸出流放到壓縮流ZipOutputStream

 List<String> fields = new ArrayList<>();
        fields.add("字段1");
        fields.add("字段2");
        fields.add("字段3");
        HSSFWorkbook workbook = excelUtil.getNewExcel("壓縮文件測試", fields);
        try {
            response.setContentType("application/zip; charset=UTF-8");
            //返回客戶端瀏覽器的版本號、類型
            String agent = request.getHeader("USER-AGENT");
            String downloadName = "壓縮文件測試.zip";
            //針對IE或者以IE爲內核的瀏覽器:
            if (agent.contains("MSIE") || agent.contains("Trident")) {
                downloadName = java.net.URLEncoder.encode(downloadName, "UTF-8");
            } else {
                downloadName = new String(downloadName.getBytes("UTF-8"), "ISO-8859-1");
            }
            response.setHeader("Content-disposition", "attachment;filename=" + downloadName);
   
            ZipOutputStream zipOutputStream = new ZipOutputStream(response.getOutputStream());
   //多個從這裏就可遍歷了
   // --start
            ZipEntry entry = new ZipEntry("第一個文件名.xls");
            zipOutputStream.putNextEntry(entry);

            ByteOutputStream byteOutputStream = new ByteOutputStream();
            workbook.write(byteOutputStream);
            byteOutputStream.writeTo(zipOutputStream);
//            zipOutputStream.write(workbook.getBytes());
            byteOutputStream.close();
            zipOutputStream.closeEntry();
            // --end
            zipOutputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

生成excel文件也貼一下,如下:

public static HSSFWorkbook getNewExcel(String formName, List<String> fields) {
        //新建excel對象
        HSSFWorkbook workbook = new HSSFWorkbook();
        //新建工作表
        HSSFSheet sheet = workbook.createSheet(formName);
        // 設置表格默認列寬度爲20個字節
        sheet.setDefaultColumnWidth((short) 20);
        // 生成一個樣式
        HSSFCellStyle style = workbook.createCellStyle();
        // 生成一個字體
        HSSFFont font = workbook.createFont();
        font.setFontHeightInPoints((short) 12);
        //字體應用到當前樣式
        style.setFont(font);
        //創建表格行
        HSSFRow row = sheet.createRow(0);
        //設置表單名稱
        row.createCell(0).setCellValue(formName);
        if (fields.size() - 1 > 0) {
            //合併單元格
            sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, fields.size() - 1));
        }
        HSSFRow row1 = sheet.createRow(sheet.getLastRowNum() + 1);
        //設置列標題行
        for (int i = 0; i < fields.size(); i++) {
            row1.createCell(i).setCellValue(fields.get(i));
        }
        return workbook;
    }

一些實踐總結,歡迎指正!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章