2014-04-03 49 views
0

嘗試讀取一個文件.docx我得到以下異常:爲什麼當我嘗試解析.docx文件時會收到異常?

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) 

at org.apache.poi.poifs.storage.HeaderBlock.<init>(HeaderBlock.java:131) 
at org.apache.poi.poifs.storage.HeaderBlock.<init>(HeaderBlock.java:104) 
at org.apache.poi.poifs.filesystem.POIFSFileSystem.<init>(POIFSFileSystem.java:128) 
at org.apache.poi.hwpf.HWPFDocumentCore.verifyAndBuildPOIFS(HWPFDocumentCore.java:106) 
at org.apache.poi.hwpf.extractor.WordExtractor.<init>(WordExtractor.java:53) 
at org.suhail.gui.Main.parseDocxFile(Main.java:245) 
at org.suhail.gui.Main.jButton1ActionPerformed(Main.java:166) 
at org.suhail.gui.Main.access$000(Main.java:21) 
at org.suhail.gui.Main$1.actionPerformed(Main.java:70) 
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995) 
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318) 
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387) 
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242) 
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236) 
at java.awt.Component.processMouseEvent(Component.java:6038) 
at javax.swing.JComponent.processMouseEvent(JComponent.java:3260) 
at java.awt.Component.processEvent(Component.java:5803) 
at java.awt.Container.processEvent(Container.java:2058) 
at java.awt.Component.dispatchEventImpl(Component.java:4410) 
at java.awt.Container.dispatchEventImpl(Container.java:2116) 
at java.awt.Component.dispatchEvent(Component.java:4240) 
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322) 
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3986) 
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916) 
at java.awt.Container.dispatchEventImpl(Container.java:2102) 
at java.awt.Window.dispatchEventImpl(Window.java:2429) 
at java.awt.Component.dispatchEvent(Component.java:4240) 
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273) 
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160) 
at java.awt.EventDispatchThread.run(EventDispatchThread.java:121) 

我得到的東西可能是異常的原因的想法,但不完全明白其中的道理。

保存的.docx文件來自2007 MS Word軟件。

片段被解析文件:

public void parseDocxFile(String textEntered) { 
    try { 
     WordExtractor extractor = new WordExtractor(new FileInputStream(new File(SContainer.getFilePath()))); 
     System.out.println(".DOCX File : " + extractor.getText()); 
    }catch(Exception exc) {exc.printStackTrace();} 
} 

注:我使用的是最新版的POI 3.10

回答

3

按照Apache的POI docs爲DOCX,你必須使用XWPF不HWPF的API 。

HWPF是我們的Microsoft Word 97(-2007)文件 格式到純Java的端口的名稱。它還爲 較舊的Word 6和Word 95文件格式提供有限的只讀支持。 到HWPF的合作伙伴,新的Word 2007的.docx格式XWPF

使用XWPF apis讀取DOCX文件。

對於基本的文本提取,請使用 org.apache.poi.xwpf.extractor.XWPFWordExtractor。它接受輸入 流或XWPFDocument。 gettext的()方法可以用來從所有段落得到 文字,用表格,頁眉等

修訂一起: 爲了解決你的問題。

What is the difference between the two ? 

讓我試着解決IMO。 .doc格式是二進制混淆文檔格式,需要第三方支持才能閱讀這些文檔,因此HWPF使用第三方支持來實現。但是從2007年起,Microsoft使用OOXML(Office對象擴展標記語言),這是公開可用的讀取此格式的API變得更容易。所以Apache實現了另一套API來讀取OOXMl格式文件(.docx)。

HWPF和XWPF不共享任何通用接口/方法/代碼。兩者都是獨立的。

我發現這個link提供使用這兩個框架的樣本。它可能有用。

+0

兩者有什麼區別? – saplingPro

相關問題