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

Другие вопросы по тегам