как создать новое слово из шаблона с помощью docx4j

У меня следующий сценарий, и мне нужен совет:

Пользователь вводит текстовый документ в качестве шаблона и предоставляет некоторые параметры во время выполнения, чтобы я мог запросить мою базу данных и получить данные для заполнения документа. Итак, есть две основные вещи, которые мне нужно сделать:

  1. Замените каждый ключ в документе соответствующим результатом текущей строки запроса.
  2. «Объединить» (скопировать? Дублировать?) Существующий документ без изменений в себя (добавить) в зависимости от того, сколько строк я получил из запроса, и заменить ключи из этой новой копии значениями следующей строки.

Каков наилучший подход для этого? На данный момент мне удалось выполнить часть замены, используя unmarshallfromtemplate, предоставив ему хэш-карту. Но этот способ немного сложен, потому что мне нужно добавить «${имя_переменной}» в документ, а иногда слова разделяют «${» и «}» в разных тегах, вызывая проблемы.

Я читал о пользовательской привязке xml, но не совсем понял. Мне нужно сгенерировать собственный XML, внедрить его в документ (все это не во время выполнения) и вызвать команду applybindings?? Если это правда, как мне связать поля в документе с xml? По имени?


person wilson    schedule 16.03.2013    source источник


Ответы (1)


docx4j включает VariablePrepare, который может привести в порядок ваш входной docx, чтобы ваши ключи не разделялись на отдельные прогоны.

Но вам все же лучше переключиться на привязку данных управления контентом, особенно если у вас есть повторяющиеся данные (подумайте, например, о позициях в счете-фактуре). Раскрытие информации: я поддерживаю этот подход в docx4j.

Чтобы принять подход привязки данных управления контентом:

  1. придумайте формат XML, подходящий для ваших данных, и напишите код для преобразования результатов запроса к базе данных в этот формат.

  2. измените свой шаблон, чтобы элементы управления содержимым были привязаны к элементам в вашем XML-документе. обычно для этого вам понадобится надстройка для Word. (Майкрософт использует для привязки технологию XPath, поэтому то, как вы привязываетесь, зависит от вашей XML-структуры, но да, обычно вы привязываетесь к имени или идентификатору элемента).

  3. теперь у вас есть XML-файл и подходящий входной docx, ContentControlsMergeXML содержит код, необходимый для создания экземпляра документа во время выполнения. Также есть версия для среды сервлетов по адресу https://github.com/plutext/OpenDoPE-WAR.

В качестве альтернативы 1 и 2 в текущих ночных файлах также есть org.docx4j.model.datastorage.migration.FromVariableReplacement, который может преобразовать ваш существующий документ «${». Однако только в стандартизированном целевом формате XML.

Если у вас есть дополнительные вопросы, есть форум, посвященный этой теме, по адресу http://www.docx4java.org/forums/data-binding-java-f16/

person JasonPlutext    schedule 16.03.2013