2013-10-02 28 views
0

我試圖用XWPFDocument類替換模板DOCX文檔與Apache POI。我有文檔中的標籤和JSON文件來讀取替換數據。我的問題是一個文本行,似乎以一定的方式,當我改變它的擴展ZIP文件,並打開document.xml分離的DOCX。例如,[MEMBER_CONTACT_INFO]文字分別變爲[MEMBER_CONTACT_INFO]POI由於DOCX的原始版本是這樣的,所以會以同樣的方式讀取它。這會在段落中創建2個XWPFRun對象,分別顯示文本爲[MEMBER_CONTACT_INFO]Apache POI中的分隔文本行XWPFRun對象

我的問題是,有沒有辦法迫使POI通過合併相關的運行或類似的東西,如Word運行?或者我該如何解決這個問題?我在替換時匹配運行文本,而我找不到我的標記,因爲它被分成2個不同的運行對象。

最佳

+0

,我想如果標籤是在一個表中它發生! – zaferaltun

+0

沒有身體沒有關於此的提示? – zaferaltun

回答

0

我也有這個問題,前幾天,我找不到任何解決辦法。我選擇使用PLACEHOLDER_NAME而不是[PLACEHOLDER_NAME]。這對我來說工作正常,它看起來像一個單一的XWPFRun對象。

3

這浪費了那麼多我的時間......一次

基本上,XWPFParagraph由多個XWPFRun秒,XWPFRun是具有固定的同一款式傳染性文本。

所以,當你嘗試寫一些像「[PLACEHOLDER_NAME]」在MS-Word中它會創建一個單一的XWPFRun。但是,如果你不小心添加了一些東西更多,然後你回去換「[PLACEHOLDER_NAME]」到別的東西它永遠不會保證它仍將是一個單一XWPFRun這是很可能的,它會分裂到兩分。 AFAIK這是MS-Word的工作原理。

如何避免因小失大的分裂在這種情況下?

解決方案:有兩個解決方案,我知道:

  1. 複製文本 「[PLACEHOLDER_NAME]」 記事本什麼的。進行必要的修改並將其複製並粘貼到您的文字文件中,而不是「[PLACEHOLDER_NAME]」,這樣您的整個「[PLACEHOLDER_NAME]」將被替換爲避免分割XWPFRuns的新文本。

  2. 選擇「[PLACEHOLDER_NAME]」,然後點擊MS-Word的「替換」選項並替換爲「[您的新編輯的佔位符]」,這將保證您的新佔位符將消耗一個XWPFRun。

如果必須再次更改新的佔位符,按照步驟1或2

0

這裏是Java代碼來修復單獨的文本行的問題。它還將處理多格式字符串替換。

public static void replaceString(XWPFDocument doc, String search, String replace) throws Exception{ 
    for (XWPFParagraph p : doc.getParagraphs()) { 
    List<XWPFRun> runs = p.getRuns(); 
    List<Integer> group = new ArrayList<Integer>(); 
    if (runs != null) { 
     String groupText = search; 
     for (int i=0 ; i<runs.size(); i++) { 
     XWPFRun r = runs.get(i); 
     String text = r.getText(0); 
     if (text != null) 
      if(text.contains(search)) { 
       String safeToUseInReplaceAllString = Pattern.quote(search); 
       text = text.replaceAll(safeToUseInReplaceAllString, replace); 
       r.setText(text, 0); 
      } 
      else if(groupText.startsWith(text)){ 
       group.add(i); 
       groupText = groupText.substring(text.length()); 
       if(groupText.isEmpty()){ 
       runs.get(group.get(0)).setText(replace, 0); 
       for(int j = 1; j<group.size(); j++){ 
        p.removeRun(group.get(j)); 
       } 
       group.clear(); 
       groupText = search; 
       } 
      }else{ 
       group.clear(); 
       groupText = search; 
      } 
     } 
    } 
} 
for (XWPFTable tbl : doc.getTables()) { 
    for (XWPFTableRow row : tbl.getRows()) { 
     for (XWPFTableCell cell : row.getTableCells()) { 
     for (XWPFParagraph p : cell.getParagraphs()) { 
      for (XWPFRun r : p.getRuns()) { 
       String text = r.getText(0); 
       if (text.contains(search)) { 
       String safeToUseInReplaceAllString = Pattern.quote(search); 
       text = text.replaceAll(safeToUseInReplaceAllString, replace); 
       r.setText(text); 
       } 
      } 
     } 
     } 
    } 
} 

}