在XWPFDocument中插入一个段落

时间:2013-12-18 20:20:44

标签: java apache-poi

我正在搜索并替换.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()为true,这似乎符合文档中的要求。

  

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

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

1 个答案:

答案 0 :(得分:5)

这样才解决了这个问题。

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();
    }
}