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