前言:這裏先介紹我今天要做的功能,先查詢數據庫導出一個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壓縮到一塊。
代碼比較簡單,這裏就不做過多講解,大家可以根據自己的實際情況的改用!不足的地方也可以留言指出!