最近项目上用到文档的解析,但是不同版本的文档解析,它们所采用的接口方法不一样,然而根据文件后缀判断也不靠谱,后缀名称有可能会更改。下面我就来给大家简单的叙述下我的解决办法:
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)
createExtractor方法的源码如下:
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 OOXMLstream");
}
2.针对excel
和word一样 poi中也有相似的方法,对此我们可采用poi 中解析excel的工厂类的方法,对于单独的版本解析方法在这里就不细说了
FileInputStream fis = new FileInputStream(file);
Workbook wb = WorkbookFactory.create(fis);
这样就可以解析不同版本的文档了,大家有兴趣的话可以看下源码的实现,它们中有对文档版本的判断 在poi-ooxml.jar中
写的比较匆忙,有时间再做补充,有说的不对的还请大牛指教。