使用poi導(dǎo)入Excel文件兼容性問題

一言不合先拋個異常
org.apache.poi.poifs.filesystem.OfficeXmlFileException: The supplied data appears to be in the Office 2007+ XML. You are calling the part of POI that deals with OLE2 Office Documents. You need to call a different part of POI to process this data (eg XSSF instead of HSSF)

HSSFWorkbook workbook =  new HSSFWorkbook(in);

這段異常表示excel版本和workbook的類型不匹配導(dǎo)致的, HSSFWorkbook不支持Excel2007之后的文件版本, poi提供了XSSFWorkbook類型支持后面的版本,

XSSFWorkbook workbook =  new XSSFWorkbook(in);

但是這段代碼對老版本的excel不兼容, 查看文檔和源碼發(fā)現(xiàn)HSSFWorkbook和XSSFWorkbook都實現(xiàn)了Workbook接口, 按照網(wǎng)上推薦的方法, 把代碼修改成了

Workbook workbook = null;
try{
    workbook = new HSSFWorkbook(in);
}catch(Exception e){
    workbook = new XSSFWorkbook(in);
}

然后. 成功的拋出了另一個異常
java.io.IOException: Stream closed
這.... 節(jié)奏不對啊, 進入try塊之后順手把流關(guān)了, 這個方法也搞不定, 難道不用流來做參數(shù)?? 還是先判斷一下流的類型????
怎么判斷???? 我是不會, 好吧, 看文檔, 我相信apache肯定能解決這個問題

好了, 代碼改成了
Workbook workbook = WorkbookFactory.create(in);
一切都正常了. 那么這個方法一定是判斷了文件類型的, 廢話不多說, 貼源碼

public static Workbook create(InputStream inp, String password) throws IOException, InvalidFormatException, EncryptedDocumentException {
        // If clearly doesn't do mark/reset, wrap up
        if (! inp.markSupported()) {
            inp = new PushbackInputStream(inp, 8);
        }

        // Ensure that there is at least some data there
        byte[] header8 = IOUtils.peekFirst8Bytes(inp);

        // Try to create
        if (NPOIFSFileSystem.hasPOIFSHeader(header8)) {
            NPOIFSFileSystem fs = new NPOIFSFileSystem(inp);
            return create(fs, password);
        }
        if (DocumentFactoryHelper.hasOOXMLHeader(inp)) {
            return new XSSFWorkbook(OPCPackage.open(inp));
        }
        throw new InvalidFormatException("Your InputStream was neither an OLE2 stream, nor an OOXML stream");
    }

當(dāng)然, maven的依賴要改成這個了

<dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>3.15</version>
</dependency>

參考資料
http://poi.apache.org/apidocs/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市悲伶,隨后出現(xiàn)的幾起案子费韭,更是在濱河造成了極大的恐慌蛹疯,老刑警劉巖皂岔,帶你破解...
    沈念sama閱讀 223,207評論 6 521
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拜马,死亡現(xiàn)場離奇詭異考抄,居然都是意外死亡细疚,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,455評論 3 400
  • 文/潘曉璐 我一進店門座泳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來惠昔,“玉大人幕与,你說我怎么就攤上這事挑势。” “怎么了啦鸣?”我有些...
    開封第一講書人閱讀 170,031評論 0 366
  • 文/不壞的土叔 我叫張陵潮饱,是天一觀的道長。 經(jīng)常有香客問我诫给,道長香拉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,334評論 1 300
  • 正文 為了忘掉前任中狂,我火速辦了婚禮凫碌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘胃榕。我一直安慰自己盛险,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 69,322評論 6 398
  • 文/花漫 我一把揭開白布勋又。 她就那樣靜靜地躺著苦掘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪楔壤。 梳的紋絲不亂的頭發(fā)上鹤啡,一...
    開封第一講書人閱讀 52,895評論 1 314
  • 那天,我揣著相機與錄音蹲嚣,去河邊找鬼递瑰。 笑死祟牲,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的抖部。 我是一名探鬼主播疲眷,決...
    沈念sama閱讀 41,300評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼您朽!你這毒婦竟也來了狂丝?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,264評論 0 277
  • 序言:老撾萬榮一對情侶失蹤哗总,失蹤者是張志新(化名)和其女友劉穎几颜,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體讯屈,經(jīng)...
    沈念sama閱讀 46,784評論 1 321
  • 正文 獨居荒郊野嶺守林人離奇死亡蛋哭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,870評論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了涮母。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谆趾。...
    茶點故事閱讀 40,989評論 1 354
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖叛本,靈堂內(nèi)的尸體忽然破棺而出沪蓬,到底是詐尸還是另有隱情,我是刑警寧澤来候,帶...
    沈念sama閱讀 36,649評論 5 351
  • 正文 年R本政府宣布跷叉,位于F島的核電站,受9級特大地震影響营搅,放射性物質(zhì)發(fā)生泄漏云挟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,331評論 3 336
  • 文/蒙蒙 一转质、第九天 我趴在偏房一處隱蔽的房頂上張望园欣。 院中可真熱鬧,春花似錦休蟹、人聲如沸沸枯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,814評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽辉饱。三九已至,卻和暖如春拣展,著一層夾襖步出監(jiān)牢的瞬間彭沼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,940評論 1 275
  • 我被黑心中介騙來泰國打工备埃, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留姓惑,地道東北人褐奴。 一個月前我還...
    沈念sama閱讀 49,452評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像于毙,于是被迫代替她去往敵國和親敦冬。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,995評論 2 361

推薦閱讀更多精彩內(nèi)容