2013-12-18 190 views
2

我正在进行搜索并替换.docx文件,并且在某些情况下替换文本包含换行符。我已经尝试了一些技巧。首先是将替换文本分成几行,然后执行:在XWPFDocument中插入段落

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空每次都返回。这可能是因为该段落位于表格单元格内,但我没有将其作为原因分离出来。我检查了游标,并且cursor.isStart()是真实的,这似乎符合文档中的要求。

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

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

+0

看来,如果我只是改变run.addCarriageReturn()来run.addBreak()以最简单的形式,这将解决了我的问题也是如此。并且救了我一天半试图弄清楚。 –

回答

1

这反过来解决了这个问题。

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

太棒了。感谢您发布答案。这非常有帮助。 –

相关问题