poi匯出excel方式和疑難
阿新 • • 發佈:2018-11-12
最近由於公司要做什麼資訊安保,要對匯出的檔案進行加密操作,供應商提供的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(); }