java 利用POI讀取execel檔案時出現 Unable to read entire header; 0 bytes read; expected 512 bytes 的解決方案

來源:互聯網
上載者:User

 公司原來在匯入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


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.