POI忽略了docx的一些片段

时间:2015-05-05 17:48:55

标签: java xml apache-poi docx

我正在尝试使用此代码(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打开文件,它会成功显示)。

1 个答案:

答案 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;
            }
        }    
    }
}

我希望这可以帮助某人一天!