[英]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.