java 多excel下載 打成zip壓縮包 程式中建立檔案 響應到瀏覽器(二)
阿新 • • 發佈:2019-01-22
在瀏覽器端點選下載,會下載一個zip壓縮包,裡面包含多個Excel檔案(二)
我暫且把從程式中下載壓縮包分為三種類型,即三步下載,兩步下載,一步下載。三步下載是指第一步先從資料庫讀取資料、寫成檔案,然後把檔案們下載到本地磁碟;第二步是把檔案們打成壓縮包;第三步是把壓縮包讀取到程式中然後響應到瀏覽器。兩步下載是指從資料庫讀取資料、寫成檔案再打成壓縮包,然後把壓縮包下載到本地磁碟,這是第一步;第二步是把壓縮包讀取到程式中然後響應到瀏覽器。一步下載是指程式從資料庫讀取資料、寫成檔案、轉成流和響應到瀏覽器,都不用寫到本地磁碟,只在記憶體中,一步輸出壓縮包。
本次先以多Excel檔案打成Zip壓縮包為例,其他檔案格式後續發表。
2.兩步下載
特點:把多excel流直接生成到zip實體中,然後把壓縮包儲存到本地;把壓縮包響應到瀏覽器
優點:比三步下載少下載Excel檔案,只需要把zip流輸出到本地
難點:ZipEntry的特性
第一步:在程式內生成Excel檔案,把資料流寫入到zip實體中,把zip輸出到本地磁碟(有標註:第一步);
第二步:在磁碟讀取zip檔案,把檔案流響應到瀏覽器端(有標註:第二步);
//第二步public static boolean fileToZip(List<byte[]>bytes, String zipFilePath, String fileName) { boolean flag = false; FileOutputStream fos = null; ZipOutputStream zos = null; try { File zipFile = new File(zipFilePath + "/" + fileName + ".zip"); if (zipFile.exists()) { System.out.println(zipFilePath + "目錄下存在名字為:" + fileName + ".zip" + "打包檔案."); } else { if(!zipFile.exists()){ zipFile.getParentFile().mkdirs(); }//第一步 fos = new FileOutputStream(zipFile); zos = new ZipOutputStream(new BufferedOutputStream(fos)); if(bytes!=null&&bytes.size()>0) for(int i=0;i<bytes.size();i++){ byte[] b=bytes.get(i); // 建立ZIP實體,並新增進壓縮包 ZipEntry zipEntry = new ZipEntry(i+".xls"); zos.putNextEntry(zipEntry); // 讀取待壓縮的檔案並寫進壓縮包裡 zos.write(b); } } } catch (FileNotFoundException e) { e.printStackTrace(); throw new RuntimeException(e); } catch (IOException e) { e.printStackTrace(); throw new RuntimeException(e); } finally { // 關閉流 try { if (null != zos) zos.close(); } catch (IOException e) { e.printStackTrace(); throw new RuntimeException(e); } } return flag; } public static void createExcel(ByteOutputStream bytes) throws Exception { // /建立工作薄 WritableWorkbook workbook = Workbook.createWorkbook(bytes); // 建立新的一頁 WritableSheet sheet = workbook.createSheet("First Sheet", 0); // 建立要顯示的內容,建立一個單元格,第一個引數為列座標,第二個引數為行座標,第三個引數為內容 Label xuexiao = new Label(0, 0, "學校"); sheet.addCell(xuexiao); Label zhuanye = new Label(1, 0, "專業"); sheet.addCell(zhuanye); Label jingzhengli = new Label(2, 0, "專業競爭力"); sheet.addCell(jingzhengli); Label qinghua = new Label(0, 1, "清華大學"); sheet.addCell(qinghua); Label jisuanji = new Label(1, 1, "計算機專業"); sheet.addCell(jisuanji); Label gao = new Label(2, 1, "高"); sheet.addCell(gao); Label beida = new Label(0, 2, "北京大學"); sheet.addCell(beida); Label falv = new Label(1, 2, "法律專業"); sheet.addCell(falv); Label zhong = new Label(2, 2, "中"); sheet.addCell(zhong); Label ligong = new Label(0, 3, "北京理工大學"); sheet.addCell(ligong); Label hangkong = new Label(1, 3, "航空專業"); sheet.addCell(hangkong); Label di = new Label(2, 3, "低"); sheet.addCell(di); // 把建立的內容寫入到輸出流中,並關閉輸出流 workbook.write(); workbook.close(); bytes.close(); } public static void main(String[] args) throws Exception { ByteOutputStream bytes = new ByteOutputStream(); ByteOutputStream bytes1 = new ByteOutputStream(); createExcel(bytes); createExcel(bytes1); List<byte[]> listBytes = new ArrayList<byte[]>(); byte[] b = bytes.getBytes(); byte[] b1= bytes1.getBytes(); listBytes.add(b); listBytes.add(b1); String zipFilePath = "F:\\update"; String fileName = "tp-admin"; fileToZip(listBytes, zipFilePath, fileName); }
//讀取zip檔案,並下載到瀏覽器 File file = new File(filePath + "/" + fileName); fis = new FileInputStream(file); byte [] buffer = new byte[fis.available()]; fis.read(buffer); fis.close(); response.reset(); response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); response.addHeader("Content-Length", "" + file.length()); OutputStream ous = new BufferedOutputStream(response.getOutputStream()); response.setContentType("application/octet-stream"); ous.write(buffer); ous.flush(); ous.close();
==================================================================