poi多文件壓縮導出

前言:這裏先介紹我今天要做的功能,先查詢數據庫導出一個excel然後把它和裏面記錄相關的圖片查出來打成一個壓縮包在頁面!excel裏面的一條記錄對應一個圖片文件夾!

效果:
這裏寫圖片描述

勾選想要導出的數據,點擊導出按鈕,然後彈出下載的zip文件
這裏寫圖片描述

打開zip壓縮包,效果如圖:
這裏寫圖片描述

第一步:所需jar
 <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.9</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.9</version>
        </dependency>

第二步 :整理需要壓縮的數據

  • 導出excel的方式很簡單,從數據庫查詢出來一個map,只需要更改mybatis的
resultType="java.util.HashMap"   

即可。我們在dao層得到一個List<Map<String, Object>> 這樣結構
的返回類型! 然後:
Map<String, Object> map = new HashMap<>(); map.put("list", maps);

就是把你得到的返回結果塞入到map裏。下面會用到!!

  • 然後我們從數據庫查找需要壓縮的圖片數據,經過遍歷處理後我得到了一個嵌套的

    map Map<String,Map<String,Object>> ,對於裏層的map,key是圖片的名字,value是圖片的路徑,我這裏都是上傳到七牛後的網絡路徑!外層的map是對圖片進行的歸類,同一保單的圖片放一起,key就是保單號!

  • 數據都整理好了接下來就亮出我寫的工具類吧—希望大家覺得好用的話給點個贊!!
package com.jy.common.utils.poi;

import net.sf.jxls.transformer.XLSTransformer;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipOutputStream;
import sun.net.www.protocol.http.HttpURLConnection;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URL;
import java.util.List;
import java.util.Map;

/**
 * 壓縮導出
 *
 * @author xiaotian
 * @create 
 */
public class ZipExportUtils {
    /**
     * 導出excel
     *
     * @param params
     * @param bomanPath
     * @param xlsName
     */
    public static void export(Map<String, Object> params,  Map<String,Map<String,Object>> allImage, String bomanPath, String xlsName, HttpServletResponse response) {
        XLSTransformer transformer = new XLSTransformer();
        InputStream is = null;
        try {
            is = new BufferedInputStream(ZipExportUtils.class.getResourceAsStream(bomanPath));
            Workbook workbook = transformer.transformXLS(is, params);
            zipImage(allImage, workbook, xlsName, response, is);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 壓縮文件
     *
     * @param
     * @param response
     */
    public static void zipImage( Map<String,Map<String,Object>> allImage, Workbook workbook, String xlsName, HttpServletResponse response, InputStream bookis) {
        setResponseHeader(response, "理賠申請記錄");
        HttpURLConnection conn = null;
        ZipOutputStream zos = null;
        InputStream in = null;
        BufferedInputStream bis = null;
        FileInputStream fis = null;
        try {
            zos = new ZipOutputStream(response.getOutputStream());
            for (String policyNo : allImage.keySet()) {
                Map<String, Object> map = allImage.get(policyNo);
                ZipEntry zip = new ZipEntry("保單_"+policyNo+ "/");
                zos.putNextEntry(zip);
                for (String s : map.keySet()) {
                    String value = (String) map.get(s);
                    URL url = new URL(value);
                    conn = (HttpURLConnection) url.openConnection();
                    conn.setDoInput(true);
                    conn.setRequestMethod("GET");
                    conn.setConnectTimeout(6000);
                    in = conn.getInputStream();
                    //創建ZIP實體,並添加進壓縮包
                    ZipEntry zipEntry = new ZipEntry( "保單_"+policyNo+"/"+s + ".png");
                    zos.putNextEntry(zipEntry);
                    zip(in, bis, zos);
                }
            }
            //把excel寫進壓縮文件流
            byte[] bufs = new byte[1024 * 10];
            zos.putNextEntry(new ZipEntry(xlsName + ".xlsx"));
            ByteArrayOutputStream tempos = new ByteArrayOutputStream();
            workbook.write(tempos);
            ByteArrayInputStream swapStream = new ByteArrayInputStream(tempos.toByteArray());
            bis = new BufferedInputStream(swapStream, 1024 * 10);
            int read = 0;
            while ((read = bis.read(bufs, 0, 1024 * 10)) != -1) {
                zos.write(bufs, 0, read);
            }
            zos.flush();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (bookis != null) bookis.close();
                zos.closeEntry();
                if (null != zos) zos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 讀寫
     *
     * @return
     * @author
     * @date 2015年7月21日
     */
    public static void zip(InputStream in, BufferedInputStream bis, ZipOutputStream zos) {
        try {
            byte[] bufs = new byte[1024 * 10];
            bis = new BufferedInputStream(in, 1024 * 10);
            int read = 0;
            while ((read = bis.read(bufs, 0, 1024 * 10)) != -1) {
                zos.write(bufs, 0, read);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (null != in) in.close();
                if (null != bis) bis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }

    /**
     * 設置響應頭
     */
    public static void setResponseHeader(HttpServletResponse response, String fileName) {
        try {
            response.reset();// 清空輸出流
            response.setContentType("application/octet-stream;charset=UTF-8");
            response.setHeader("Content-Disposition", "attachment;filename="
                    + new String(fileName.getBytes("GB2312"), "8859_1")
                    + ".zip");
            response.addHeader("Pargam", "no-cache");
            response.addHeader("Cache-Control", "no-cache");
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

這裏說明一下這個工具類,入口方法爲export,你在controller層調用這個方法的時候,傳遞的params就是我們要導出excel的map,allImage就是圖片數據,bomanPath,是excel模版的路徑 .
/excelTemplate/claimExcel.xlsx 這裏寫圖片描述
具體路徑看你的項目!這裏記得把模版裏面填入表達式:
這裏寫圖片描述
xlsName爲excel的文件名字,response就是controller層傳遞過來的輸出流用!export方法主要是先生成一個workbook,然後傳遞下去,把圖片和excel壓縮到一塊。

代碼比較簡單,這裏就不做過多講解,大家可以根據自己的實際情況的改用!不足的地方也可以留言指出!

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