1. 程式人生 > >poi匯出excel方式和疑難

poi匯出excel方式和疑難

最近由於公司要做什麼資訊安保,要對匯出的檔案進行加密操作,供應商提供的api對檔案進行加密需要檔案路徑,現有的匯出都直接輸出流解決,沒辦法只能改變匯出方法,在尋找好的匯出過程試過許多方式,也遇到很蛋疼的問題。

首先匯出excel的方式目前發現以下3種,1:最常用的輸出流形勢直接將檔案返回給客戶端。也就是OutputStream out = response.getOutputStream(); 這種方式特點是在伺服器不會存在檔案,匯出很乾淨。

2:將檔案生成在tomcat然後將檔案路徑給客戶端下載 也就是說客戶端匯出服務端只是生成檔案和返回檔案地址 然後客戶端windows.open(url)就可以下載。

3:還是流 不過繞了一圈,程式碼如下(這裡只講這種方式,其他的網上很多相關資料)
          

InputStream in = null;
			try {
				FileOutputStream fileOut = new FileOutputStream("D:/user.xls");//指定路徑與名字和格式
				workbook.write(fileOut);
				fileOut.close();
				 in = new FileInputStream("D:/user.xls");
				 byte[] b = new byte[1024];
		            while((in.read(b))>0)
		            {
		                out.write(b);
		            }	
} catch (Exception e) { e.printStackTrace(); }finally{ out.close(); in.close(); }
這塊程式碼意思就是 先用poi生成excel在伺服器磁碟中,然後讀取該檔案交給方法一中的輸出流輸出。但是這方法存在一個問題:在谷歌瀏覽器匯出沒問題,
在qq瀏覽器匯出檔案有問題,匯出是匯出了但是控制檯報錯ClientAbortException:  java.io.IOException  這個問題查了許久,網上查了許多方法有的說使用者點選頻繁,有的說是進行了多個相同的請求,有的說是tomcat timeout什麼引數設定小了
但是在我環境都無法解決異常,沒辦發了只能這樣忽略這個異常了,畢竟至少匯出的excel是沒問題了 慚愧這樣的解決的方式 
				 if("ClientAbortException".equals(e.getClass().getSimpleName())){      
			            System.out.println("客戶端重新整理太快了");   
			       }else  {  
			       e.printStackTrace();   }