公司原來在匯入execel檔案時,是一個一個匯入的;也即,每一個匯入檔案都要有對應的java代碼實現,所以在讀取execel檔案的時候沒出現什麼問題,這兩天,準備把以前的做法廢掉,統一封裝一下,以達到只要根據設定檔就能解析所有的execel檔案並將結果返回。
在實現過程中,剛開始時用demo寫的,所以execel檔案是全路徑的(類似於c://test/XXX.xls),解析的時候需要兩次開啟同一個execel檔案,不過都不會出現問題。後來移植到到項目中去的時候,由於是直接通過網頁匯入的,只能擷取其InputStream流,不能擷取其絕對路徑。由於需要兩次用到inputStream,故就出現了Unable to read entire header; 0 bytes read; expected 512 bytes 這樣的問題。
網上找了好久,很多解決方案都不行,後來才想到InputStrem流只能用一次,第二次就失效了,才導致了以上的問題。解決的方法有兩種,(參考http://simpleframework.net/bbs/835/27640.html),我選擇首先將這個inputstrem流用位元組數字存起來,要用的時候再用ByteArrayInputStream封裝(參考http://hiok.blog.sohu.com/65555266.html),具體如下:
//一開始,就把流對象用位元組數字儲存起來 byte[] buf = org.apache.commons.io.IOUtils.toByteArray(execelIS)//execelIS為InputStream流 ///////////////////////// //在需要用到InputStream的地方再封裝成InputStream ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(buf); Workbook wb = new HSSFWorkbook(byteArrayInputStream);//byteArrayInputStream 繼承了InputStream,故這樣用並沒有問題 ///其它要用到的地方也是同樣的原理 //主:如果只需要用到一次inputstream流,就不用這樣啦,直接用就OK