我正在搜索并替换.docx文件,在某些情况下,替换文本包含换行符.我为此尝试了几种技术.第一个是将替换文本拆分为行并执行:
run.setText(lines[0], 0); for(int x=1; 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.有什么建议?
结果是解决了这个问题.
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(); } }