2015-10-20 187 views
1

我使用Apache POI創建一個.docx文件用下面的代碼:的Java:XWPFWordExtractor.getText()拋出NullPointerException異常

XWPFDocument document = new XWPFDocument(); 
XWPFParagraph paragraph = document.createParagraph(); 
XWPFRun run = paragraph.createRun(); 
run.setText(text); 
String filePath = outputPathWithoutExtension + ".docx"; 
try { 
    FileOutputStream stream = new FileOutputStream(new File(filePath)); 
    document.write(stream); 
    stream.close(); 
} catch (IOException exception) { 
    LOGGER.error("Could not create file '{}'", filePath); 
} 

,然後我嘗試用下面的代碼來閱讀:

FileInputStream fileStream = new FileInputStream(filePath); 
try { 
    XWPFDocument docx = new XWPFDocument(fileStream); 
    XWPFWordExtractor wordExtractor = new XWPFWordExtractor(docx); 
    text = wordExtractor.getText(); 
} catch (IOException | POIXMLException | OfficeXmlFileException 
      | NullPointerException exception) { 
    LOGGER.error("Could not load file - Exception: {}", exception.getMessage()); 
} 

在哪裏我打電話getText()行,它拋出一個NullPointerException

java.lang.NullPointerException 
at org.apache.poi.xwpf.extractor.XWPFWordExtractor.extractHeaders(XWPFWordExtractor.java:162) 
at org.apache.poi.xwpf.extractor.XWPFWordExtractor.getText(XWPFWordExtractor.java:87) 

這個問題似乎是extractText調用extractHeadersXWPFHeaderFooterPolicy的文件...在我的情況是空的。當它試圖在第一線使用它時......繁榮。

我試圖創建自己的「頁眉/頁腳政策」,例如:

try { 
    new XWPFHeaderFooterPolicy(document); 
} catch (IOException | XmlException exception) { 
    LOGGER.warn("Could not create output document header - " 
      + "document might not be readable in all readers"); 
} 

然而,這本身將引發NullPointerException,因爲它試圖通過doc.getDocument().getBody().getSectPr()訪問「SectPr」的文件,它返回null ...然後第一次使用那個......繁榮。

所以,我的問題是:我顯然沒有正確創建XWPFDocument ...有人可以讓我平直嗎?

備註:如果我在Word中打開文件,文件看起來很好。如果在創建和讀取文件之間,我打開它,編輯它,保存並關閉它,然後getText()的調用按預期執行,沒有NullPointerException。 Word必須在保存時填寫適當的頁眉/頁腳策略。

+0

看起來是一個錯誤 - 你嘗試報告爲一個bug爲[Apache的POI bug跟蹤系統(https://開頭BZ。 apache.org/bugzilla/enter_bug.cgi?product=POI)? – Gagravarr

回答

0

啊哈!我在這裏找到了我的答案:How to create a header/footer in new docx document?

我基本上剛剛放棄了一步。將此代碼添加到文檔創建中的允許它讀取:

// Add a SectPr and header/footer policy so document can be opened and read by POI 
try { 
    document.getDocument().getBody().addNewSectPr(); 
    new XWPFHeaderFooterPolicy(document); 
} catch (IOException | XmlException exception) { 
    LOGGER.warn("Could not create output document header - " 
      + "document might not be readable in all readers"); 
} 
相關問題