2014-04-03 144 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

相关问题