我正在对 .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。有什么建议吗?
结果解决了问题。
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();
}
}