2015-03-08 2 views
0

Я новичок в Apache POI, и у меня возникли проблемы с заменой текста.Apache POI XWPF не заменяет, а объединяет

Я скопировал свой код здесь Replacing a text in Apache POI XWPF not working

Это работает, но он не заменяет текст, но присоединяет его. Итак, если у меня «Быстрая коричневая лиса перепрыгивает» и замените «над» на «внизу». Я получаю «Быстрые коричневые лисицы, прыгающие по крутому коричневому лису, прыгающему под».

Что не так?

Так вот код:

public class testPOI { 

    public static void main(String[] args) throws Exception{ 

     String filepath = "F:\\MASTER_DOC.docx"; 
     String outpath = "F:\\Test.docx"; 

     XWPFDocument doc = new XWPFDocument(new FileInputStream(filepath)); 
     for (XWPFParagraph p : doc.getParagraphs()){ 

      int numberOfRuns = p.getRuns().size(); 

      // Collate text of all runs 
      StringBuilder sb = new StringBuilder(); 
      for (XWPFRun r : p.getRuns()){ 
       int pos = r.getTextPosition(); 
       if(r.getText(pos) != null) { 
        sb.append(r.getText(pos)); 
       } 
      } 

      // Continue if there is text and contains "test" 
      if(sb.length() > 0 && sb.toString().contains("test")) { 
       // Remove all existing runs 
       for(int i = 0; i < numberOfRuns; i++) { 
        p.removeRun(i); 
       } 
       String text = sb.toString().replace("test", "DOG"); 
       // Add new run with updated text 
       XWPFRun run = p.createRun(); 
       run.setText(text); 
       p.addRun(run); 
      } 
     } 
     doc.write(new FileOutputStream(outpath)); 
    } 
} 

EDIT 1: Это странно! Я попытался заменить на 2-й прогон, отлично работает. Что-то не так с 1-м прогоном. Может ли кто-нибудь указать на это?

+1

Что произойдет, если вы попытаетесь удалить пробеги от конца к началу 'для (INT I = numberOfRuns-1, я> = 0; i--) {p.removeRun (я); } ' –

+0

@ ClemensKlein-Robbenhaar Это сработало! Есть ли объяснение причин? – Audix

+0

Вы изменяете (сокращаете) список, итерации по нему. Итерация в направлении «вперед» заставляет вас прыгать через каждый второй элемент в списке. (Если нужно, я могу предоставить отдельный ответ для подробностей.) Кажется, что 'p.removeRun (i);' не бросает 'IndexOutOfBoundsException', если' i' больше, чем размер списка, или проблема была бы очевидна , –

ответ

0

Я пробовал это. Оно работает.

public class testPOI { 

public static void main(String[] args) throws Exception{ 

    String filepath = "F:\\MASTER_DOC.docx"; 
    String outpath = "F:\\Test.docx"; 

    XWPFDocument doc = new XWPFDocument(new FileInputStream(filepath)); 
    for (XWPFParagraph p : doc.getParagraphs()){ 

     int numberOfRuns = p.getRuns().size(); 

     // Collate text of all runs 
     StringBuilder sb = new StringBuilder(); 
     for (XWPFRun r : p.getRuns()){ 
      int pos = r.getTextPosition(); 
      if(r.getText(pos) != null) { 
       sb.append(r.getText(pos)); 
      } 
     } 

     // Continue if there is text and contains "test" 
     if(sb.length() > 0 && sb.toString().contains("test")) { 
      // Remove all existing runs 
      for(int i = numberOfRuns; i >=0 ; i--) { 
       p.removeRun(i); 
      } 
      String text = sb.toString().replace("test", "DOG"); 
      // Add new run with updated text 
      XWPFRun run = p.createRun(); 
      run.setText(text); 
      p.addRun(run); 
     } 
    } 
    doc.write(new FileOutputStream(outpath)); 
} 
} 
Смежные вопросы