Заменить текст в текстовом поле в таблице, используя Apache POI - PullRequest
0 голосов
/ 20 марта 2020

Я использую Apache POI для замены текста в некоторых документах Word, а некоторые тексты содержатся в текстовых полях. Для текстовых полей, непосредственно включенных в абзацы, я могу использовать ответ отсюда: Заменить текст в текстовом поле docx, используя Apache POI (мне просто нужно было изменить selectPath).

Тем не менее, мои документы также содержат текстовые поля в таблицах. Таким образом, путь в XML для документа выглядит не так:

w:p > w:sdt > w:sdtContent > w:r > w:t > TEXT

Но вот так:

w:tbl > w:tr > w:sdt > w:sdtContent > w:tc > w:p > w:r > w:t > TEXT

Используя код из другого вопроса и изменив его для выполнения над таблицей вместо абзацев, я ожидаю, что он будет выглядеть примерно так:

    for (XWPFTable tbl : doc.getTables()) {
      for (XWPFTableRow row : tbl.getRows()) {
        CTRow ctRow = row.getCtRow();
        XmlCursor cursor = ctRow.newCursor();
        cursor.selectPath("declare namespace w='http://schemas.openxmlformats.org/wordprocessingml/2006/main' .//*/w:r");

        List<XmlObject> ctrsintxtbx = new ArrayList<XmlObject>();
        while (cursor.hasNextSelection()) {
          cursor.toNextSelection();
          XmlObject obj = cursor.getObject();
          ctrsintxtbx.add(obj);
        }
        for (XmlObject obj : ctrsintxtbx) {
          CTR ctr = CTR.Factory.parse(obj.xmlText());

          XWPFRun bufferrun = new XWPFRun(ctr, ???<IRunBody>???);
          String text = bufferrun.getText(0);

          if (text != null && text.contains(findText)) {
            text = text.replace(findText, replaceText);
            bufferrun.setText(text, 0);
            obj.set(bufferrun.getCTR());
          }
        }
      }
    }

Я вижу, что экземпляр "ctr" содержит мой текст, но я не знаю, как это изменить. Код из другого вопроса создает экземпляр XWPFRun, но для этого требуется IRunBody в качестве родителя. В другом вопросе это работает, потому что текст содержался в абзаце, который является IRunBody. Однако у меня нет экземпляра Paragraph, но есть XWPFTableRow, и это не IRunBody. Я попытался напрямую извлечь абзацы из таблицы / строки / ячейки, но ни один из них не содержит моего текста.

Так как я могу изменить эти тексты?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...