最近項目上用到文檔的解析,但是不同版本的文檔解析,它們所採用的接口方法不一樣,然而根據文件後綴判斷也不靠譜,後綴名稱有可能會更改。下面我就來給大家簡單的敘述下我的解決辦法:
1.針對word的解析
一般的解析方法:
03版本: InputStream is = new FileInputStream(new File("c://files//2003.doc"));
WordExtractor ex = new WordExtractor(is);
String text2003 = ex.getText();
07版本:OPCPackage opcPackage = POIXMLDocument.openPackage("c://files//2007.docx"); POIXMLTextExtractor extractor = new XWPFWordExtractor(opcPackage);
String text2007 = extractor.getText();
但是對於判斷文檔版本號,根據不同版本調用不同方法,剛開始樓主也木有想到好的方法就翻了一下poi的源碼,發現可以這樣實 現:
FileInputStream fis = new FileInputStream(file);
POITextExtractor pte=ExtractorFactory.createExtractor(fis);
if(pte!=null){
content=pte.getText();
}
ExtractorFactory.createExtractor(fis) 這個方法源碼中對文檔版本號進行了判斷,所以我們就不用再擔心了
源碼:public static POITextExtractor createExtractor(InputStream inp)
throws IOException, InvalidFormatException, OpenXML4JException, XmlException
{
if (!inp.markSupported()) {
inp = new PushbackInputStream(inp, 8);
}
if (NPOIFSFileSystem.hasPOIFSHeader(inp)) {
return createExtractor(new NPOIFSFileSystem(inp));
}
if (POIXMLDocument.hasOOXMLHeader(inp)) {
return createExtractor(OPCPackage.open(inp));
}
throw new IllegalArgumentException("Your InputStream was neither an OLE2 stream, nor an OOXML stream");
}
2.針對excel
和word一樣 poi中也有相似的方法,對此我們可採用poi 中解析excel的工廠類的方法,對於單獨的版本解析方法在這裏就不了
FileInputStream fis = new FileInputStream(file);
Workbook wb = WorkbookFactory.create(fis);
這樣就可以解析不同版本的文檔了,大家有興趣的話可以看下源碼的實現,它們中有對文檔版本的判斷 在poi-ooxml.jar中
寫的比較匆忙,有時間再做補充,有說的不對的還請大牛指教。