簡體   English   中英

為什么在嘗試解析.docx文件時出現異常?

[英]Why am I getting an exception as I try to parse .docx file?

嘗試讀取.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

根據針對docx的Apache POI 文檔 ,您必須使用XWPF而不是HWPF api。

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

使用XWPF API讀取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不共享任何公共接口/方法/代碼。 兩者都是獨立的。

而且我發現此鏈接提供了同時使用兩個框架的示例。 它可能有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM