1. 程式人生 > >解決POI匯入EXCEL相容問題

解決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相容問題的同學參考

本文僅個人觀點,如有錯誤請指正!