解決POI匯入EXCEL相容問題
公司專案中需要用到excel匯入,在權衡使用jxl還是POI後,決定使用版本相容性更好的POI。下面介紹一下使用poi遇到的問題:
一開始寫了一個工具類關鍵程式碼如下:
HSSFWorkbook workbook = new HSSFWorkbook(in);
後面考慮到POI解析excel要考慮excel2003和2007之後的版本,參考網上大把的解決方法就有了如下的方法
其中:XSSFWorkBooK類可以解析2007之後的excel版本
HSSFWorkBook類則是解析2003的版本
這種寫法看起來非常合理,也用了幾個月,沒想到最近又有一個功能模組用到了poi,匯入功能測試的時候發現,我自己的excel匯入沒有任何問題,而同事匯入測試時會報
為了測試問題的所在,我直接在工具類main方法中解析本地的excel,程式碼如下
結果還是報錯:
這個錯誤說流已經被關閉,可是我並沒有,思前想後,自己並沒有關閉
Workbook work = null;
try {
work = new HSSFWorkbook(stream);
} catch (Exception e) {
work = new XSSFWorkbook(stream);
}
debug追蹤了一下,發現執行完這段程式碼後不論是有沒有進catch,work都是空,說明該輸入流無法建立workbook物件
但是如果把file路徑換成path2或path3就可以解析
這就無關乎是.xls還是.xlsx的事了,不過也可能是因為path2路徑的檔案字尾是強制改成.xlsx的(後面證實確實是)
沒想明白具體是啥原因我接著跟蹤springMvc傳過來的file得到的InputStream有什麼區別,結果發現:
path2和path3的檔案獲得的輸入流的型別是FileInputStream,而path1的檔案的型別是ByteArrayInputStream。
而HSSFWorkBook能解析FileInputStream,XSSFWorkBook則可以解析ByteArrayInputStream。
這就讓我想到了是不是兩個獲得WorkBook順序的問題,如圖:
兩個語句換個順序後發現果真是,但是又出現新問題,換了順序後,path1能解析,但是path2和path3又不能解析,也就是說輸入流經過第一個語句進入到catch語句後流似乎被自動關閉(個人猜測)
咋辦嘞。。。。
突然想到兩個檔案獲得輸入流不同,是不是可以通過判斷輸入流的不同,進而手動選擇是用HSSFWorkbook還是XSSFWorkbook。貼程式碼(暫時可行)
哈哈,,,,,,雖然土,
雖然解決了,但總感覺不怎麼靠譜,繼續尋找辦法
poi官方給出了的解決方案是:
測試通過,完美~,給遇到poi相容問題的同學參考
本文僅個人觀點,如有錯誤請指正!