пример - java word export




Замена текста в Apache POI XWPF не работает (3)

В настоящее время я пытаюсь работать над кодом, упомянутым в предыдущем сообщении под названием « Замена текста в Apache POI XWPF» .

Я пробовал нижеследующее, и он работает, но я не знаю, не пропал ли я что-нибудь. Когда я запускаю код, текст не заменяется, а добавляется в конец поиска. Например, я создал базовый документ слова и ввел текст «test». В приведенном ниже коде, когда я запускаю его, я в конечном итоге получаю новый документ с текстом «testDOG».

Мне пришлось изменить исходный код из String text = r.getText (0) в String text = r.toString (), потому что я продолжал получать NullError при запуске кода.

import java.io.*;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;


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(OPCPackage.open(filepath));
    for (XWPFParagraph p : doc.getParagraphs()){
        for (XWPFRun r : p.getRuns()){
            String text = r.toString();
            if(text.contains("test")) {
                text = text.replace("test", "DOG");
                r.setText(text);
            }
        }
    }
   doc.write(new FileOutputStream(outpath));
}

EDIT: Спасибо за вашу помощь всем. Я просмотрел и нашел решение о значении столбца Replace table в Apache POI


Ваша логика не совсем правильная. Сначала нужно собрать весь текст в прогонах, а затем выполнить замену. Вам также необходимо удалить все прогоны для абзаца и добавить новый одиночный прогон, если найдено совпадение «тест».

Попробуйте это вместо этого:

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));
    }
}

Этот метод заменяет строки поиска в параграфах и может работать со строками, охватывающими более одного прогона.

  private long replaceInParagraphs(Map<String, String> replacements, List<XWPFParagraph> xwpfParagraphs) {
    long count = 0;
    for (XWPFParagraph paragraph : xwpfParagraphs) {
      List<XWPFRun> runs = paragraph.getRuns();

      for (Map.Entry<String, String> replPair : replacements.entrySet()) {    
        String find = replPair.getKey();
        String repl = replPair.getValue();
        TextSegement found = paragraph.searchText(find, new PositionInParagraph());
        if ( found != null ) {
          count++;
          if ( found.getBeginRun() == found.getEndRun() ) {
            // whole search string is in one Run
            XWPFRun run = runs.get(found.getBeginRun());
            String runText = run.getText(run.getTextPosition());
            String replaced = runText.replace(find, repl);
            run.setText(replaced, 0);
          } else {
            // The search string spans over more than one Run
            // Put the Strings together
            StringBuilder b = new StringBuilder();
            for (int runPos = found.getBeginRun(); runPos <= found.getEndRun(); runPos++) {
              XWPFRun run = runs.get(runPos);
              b.append(run.getText(run.getTextPosition()));
            }                       
            String connectedRuns = b.toString();
            String replaced = connectedRuns.replace(find, repl);

            // The first Run receives the replaced String of all connected Runs
            XWPFRun partOne = runs.get(found.getBeginRun());
            partOne.setText(replaced, 0);
            // Removing the text in the other Runs.
            for (int runPos = found.getBeginRun()+1; runPos <= found.getEndRun(); runPos++) {
              XWPFRun partNext = runs.get(runPos);
              partNext.setText("", 0);
            }                          
          }
        }
      }      
    }
    return count;
  }

Не тратьте впустую свое время, когда вы можете держать вещи простыми:

// скачать с http://www.independentsoft.de/jword/evaluation.html import com.independentsoft.office.word.WordDocument;

открытый класс JWORD {

public static void main(String[] args) {

    String filepath = "C:\\Users\\setrivayne\\Downloads\\TEST.docx";
    String outpath = "C:\\Users\\setrivayne\\Downloads\\TEST.docx";

    try {

         WordDocument doc = new WordDocument(filepath);

         doc.replace("FIRST NAME", "first name");
         doc.replace("MIDDLE NAME", "middle name");
         doc.replace("LAST NAME", "last name");

         doc.save(outpath, true);

     } catch (Exception e) {
         System.out.println(e.getMessage());
         e.printStackTrace();
     }
}

}





apache-poi