Я использую 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. Я попытался напрямую извлечь абзацы из таблицы / строки / ячейки, но ни один из них не содержит моего текста.
Так как я могу изменить эти тексты?