Docx4j не заменяет переменные
Я просто следовал подходу № 2 в VariableReplace примере от docx4j 2.8.1 и всем, что он делает, заключается в удалении маркеров переменных ${}.
Действия, которые я сделал:
- Открыл Word 2013, набрал ${variable} только как текст
- Сохранено это где-то
- прочитайте его в моей программе Java и создайте мою HashMap с .put( "variable", "TEST" );
- другой код скопирован и вставлен из приведенного выше примера.
- Сохраненный документ
Я бы ожидал "ТЕСТ" исключительно и получал просто "переменную" без маркеров в выходном документе.
Ответы
Ответ 1
Без сомнения, Word разбивает вашу "переменную" на пробежки, с грамматикой или орфографическими флагами.
Исправьте его VariablePrepare
Поместите эту строку после создания экземпляра WordprocessingMLPackage:
VariablePrepare.prepare(wordMLPackage);
Затем вы можете использовать свои сопоставления для замены переменных.
Ответ 2
Я понимаю, что это старый пост, но для других, которые наткнулись на это, еще одна причина, по которой вы можете получить этот результат, - это иметь неправильные "ключи" в вашем HashMap. Поэтому в моем случае я использовал свой старый XML-формат в качестве ключа, например
.put("<variable/>","TEST");
когда я должен был использовать:
.put("variable","TEST");
В самом документе использовались теги типа
${variable}
Код VariableReplace удалит форматирование ${}, найдено совпадение или нет. Поэтому, если он не находит совпадения, по некоторым причинам ключи могут не соответствовать тем, которые содержатся в документе, и это может быть строго не связано с VariablePrepare. Но это было очень полезно для меня, так как решение VariablePrepare, VariableReplace теперь работает для моих целей.
Кроме того, я не уверен, что даже VariablePrepare может обрабатывать случай, когда вы изменяете шрифт, выделение или другое форматирование в середине вашего тега в документе. В таких случаях он не сможет объединить тег в один прогон, и поэтому распознавание тегов, скорее всего, не удастся.
Ответ 3
Основная причина, по которой переменные не могут быть заменены:
используя простой текст, такой как ${name}
вместо типа поля MERGEFIELD.
Вот ссылка, как добавить MERGEFIELD в документ - https://www.systemonesoftware.com/en/support/article/38-merge-fields-in-word-for-windows
Также вы можете использовать Docx-штамп с SpEL - https://github.com/thombergs/docx-stamper