我正在尝试使用此代码(POI 3.11)从docx文件中提取文本:
XWPFDocument doc = new XWPFDocument(OPCPackage.open("sample.docx"));
for (XWPFParagraph p : doc.getParagraphs()) {
List<XWPFRun> runs = p.getRuns();
if (runs != null) {
for (XWPFRun r : runs) {
String text = r.getText(0);
System.out.println(text);
}
}
}
这是sample.docx中的document.xml文件:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<w:document xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing">
<w:body>
<w:p>
<w:pPr>
<w:pStyle w:val="Normal"/>
<w:rPr/>
</w:pPr>
<w:bookmarkStart w:id="0" w:name="__DdeLink__59_1605705532"/>
<w:bookmarkEnd w:id="0"/>
<w:r>
<w:rPr/>
<w:t>A</w:t> // THIS PRINT!
<w:tab/>
<w:t>B</w:t> // THIS IS NOT! WHY?!
</w:r>
</w:p>
<w:sectPr>
<w:type w:val="nextPage"/>
<w:pgSz w:h="16838" w:w="11906"/>
<w:pgMar w:bottom="1134" w:footer="0" w:gutter="0" w:header="0" w:left="1134" w:right="1134" w:top="1134"/>
<w:pgNumType w:fmt="decimal"/>
<w:formProt w:val="false"/>
<w:textDirection w:val="lrTb"/>
<w:docGrid w:charSpace="4294961151" w:linePitch="240" w:type="default"/>
</w:sectPr>
</w:body>
</w:document>
当我运行代码时,结果如下:
A
我不明白为什么,但由于未知原因,文本中的某些片段(字母B)被忽略(如果我使用LibreOffice打开文件,它会成功显示)。
答案 0 :(得分:0)
查看此链接(http://apache-poi.1045710.n5.nabble.com/POI-3-10-1-XWPFRun-getText-Does-Not-Return-Full-Line-of-Text-tp5716539p5716541.html),我发现每个段落可能有多次运行(文本片段),每个段落可能有不同的样式或不具有,具体取决于文件的历史记录。
在此版本中,该文件有一个段落,其中包含两个文本片段。在String text = r.getText(0)
我只抓了其中一个。
我怎么能在API中找不到返回段落所有片段的方法,我需要做一个解决方法来解决:
if (runs != null) {
for (XWPFRun r : runs) {
int i = 0;
while (true) {
try {
String text = r.getText(i);
if (text == null) {
break;
}
System.out.println(text);
i++;
} catch (IndexOutOfBoundsException ex) {
break;
}
}
}
}
我希望这可以帮助某人一天!