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