我正在搜索并替换.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。有什么建议吗?
答案 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();
}
}