2013-12-18 172 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

太棒了。感謝您發佈答案。這非常有幫助。 –

相關問題