在XWPFDocument中插入段落

问题描述 投票:0回答:1

我正在对 .docx 文件进行搜索和替换,在某些情况下替换文本包含换行符。我为此尝试了几种技术。第一个是将替换文本分成几行并执行以下操作:

run.setText(lines[0], 0);
for (int x = 1; x < lines.length; x++) {
    run.addCarriageReturn();
    run.setText(lines[x]);
}

结果都在一行上运行。

然后我做了一些搜索,发现了这段代码,用于将现有段落替换为每行一组段落:

private void replaceParagraph(XWPFParagraph p, String[] paragraphs) {
    if (p != null) {
        XWPFDocument doc = p.getDocument();
        for (int i = 0; i < paragraphs.length; i++) {
            XmlCursor cursor = p.getCTP().newCursor();
            XWPFParagraph newP = doc.insertNewParagraph(cursor);
            newP.setAlignment(p.getAlignment());
            newP.getCTP().insertNewR(0).insertNewT(0).setStringValue(paragraphs[i]);
            newP.setNumID(p.getNumID());
        }
        doc.removeBodyElement(doc.getPosOfParagraph(p));
    }
}

问题是

insertNewParagraph
每次都返回null。这可能是因为该段落位于表格单元格内,但我没有将其作为原因。我检查了光标,
cursor.isStart()
是真的,这似乎符合文档的要求。

在光标位置添加新段落。光标必须位于文档正文子元素的 XmlCursor.TokenType.START 标记上。完成此方法后,作为参数传递的光标指向新插入段落的 XmlCursor.TokenType.END。

我已经仔细检查了

doc != null
,我想不出任何其他原因可能会返回 null。有什么建议吗?

java apache-poi
1个回答
8
投票

结果解决了问题。

private void createParagraphs(XWPFParagraph p, String[] paragraphs) {
    if (p != null) {
        XWPFDocument doc = p.getDocument();
        XmlCursor cursor = p.getCTP().newCursor();
        for (int i = 0; i < paragraphs.length; i++) {
            XWPFParagraph newP = doc.createParagraph();
            newP.getCTP().setPPr(p.getCTP().getPPr());
            XWPFRun newR = newP.createRun();
            newR.getCTR().setRPr(p.getRuns().get(0).getCTR().getRPr());
            newR.setText(paragraphs[i]);
            XmlCursor c2 = newP.getCTP().newCursor();
            c2.moveXml(cursor);
            c2.dispose();
        }
        cursor.removeXml(); // Removes replacement text paragraph
        cursor.dispose();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.