Я новичок в 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-м прогоном. Может ли кто-нибудь указать на это?
Что произойдет, если вы попытаетесь удалить пробеги от конца к началу 'для (INT I = numberOfRuns-1, я> = 0; i--) {p.removeRun (я); } ' –
@ ClemensKlein-Robbenhaar Это сработало! Есть ли объяснение причин? – Audix
Вы изменяете (сокращаете) список, итерации по нему. Итерация в направлении «вперед» заставляет вас прыгать через каждый второй элемент в списке. (Если нужно, я могу предоставить отдельный ответ для подробностей.) Кажется, что 'p.removeRun (i);' не бросает 'IndexOutOfBoundsException', если' i' больше, чем размер списка, или проблема была бы очевидна , –