1. 程式人生 > >java 多excel下載 打成zip壓縮包 程式中建立檔案 響應到瀏覽器(二)

java 多excel下載 打成zip壓縮包 程式中建立檔案 響應到瀏覽器(二)

         在瀏覽器端點選下載,會下載一個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();

==================================================================