日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

excel版本问题解决方案

發布時間:2024/1/18 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 excel版本问题解决方案 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在實際的開發中遇到過的問題,簡單的描述一下。就是需要解析Excel
文件,讀取數據入庫,并且將文件也入庫(文件路徑)。解析完成后,文件入庫的數據莫名其妙的多了一個文件名0000000000000
的文件。搞得很蒙逼。經過報錯信息,打斷點,才找到問題原因,excel 版本,沒有兼容的問題。 兼容那一塊只使用了try-catch
處理。在打開Excel文件之后并沒有進行關閉流導致。相當于第一次,打開流,未關閉,第二次打開處理完數據文件,流關閉

我將貼出解決方案,希望對大家有些借鑒。


Java InputStream.markSupported()獲取輸入流是否支持mark和reset操作

InputStream.markSupported只有返回true,則流將以某種方式記住在調用mark之后讀取的所有字節,這個時候調用reset()方法才行

在JAVA中提供了一種回退輸入流(PushbackInputStream、PushbackReader),可以把讀取進來的某些數據重新回退到輸入流的緩沖區之中。

根據文件的頭部信息去判斷,創建合適的類型

上面的解決方案是借鑒了WorkbookFactory.create()中的源碼來實現的。
在WorkbookFactory.create()函數中,肯定有做過對文件類型的判斷,一起來看一下源碼是如何判斷的:

/*** Creates the appropriate HSSFWorkbook / XSSFWorkbook from* the given InputStream.* Your input stream MUST either support mark/reset, or* be wrapped as a {@link PushbackInputStream}!*/public static Workbook create(InputStream inp) throws IOException, InvalidFormatException {// If clearly doesn't do mark/reset, wrap up//此輸入流是否支持if(! inp.markSupported()) {inp = new PushbackInputStream(inp, 8);//回退流}if(POIFSFileSystem.hasPOIFSHeader(inp)) {//Excel 2003return new HSSFWorkbook(inp);}if(POIXMLDocument.hasOOXMLHeader(inp)) { //Excel 2007return new XSSFWorkbook(OPCPackage.open(inp));}throw new IllegalArgumentException("Your InputStream was neither an OLE2 stream, nor an OOXML stream");}

總結

以上是生活随笔為你收集整理的excel版本问题解决方案的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。