Comments 10
А вы не пробовали пользоваться полями документа? Внешними источниками данных? Word — это не только и не столько текстовый редактор, это мощнейшая платформа генерации динамических документов.

Что сложного в том, чтобы расставить поля нужным образом, а в свойствах документа указать, например, контрагента — Word сам подтянет остальные реквизиты из внешней базы.

При всем моем уважении к человеческому труду, ваш способ напоминает записки маркером на блинах жестких дисков.

P.S. Кто-нибудь пользуется MS Office в большей степени, чем «написать диплом-расставить заголовки-сгенерить оглавление»?
Это отлично, что вы припомнили этот способ заполнения документа, но у него есть недостатки в реальной жизни.
Продакшн сервер крутится на *nix, использует стек Java-технологий. Как мне заполнить документ? Держать выделенный сервер с Windows только для процессинга?

Заявление «ваш способ напоминает записки маркером на блинах жестких дисков» мне кажется необоснованным, взгляните на указанные мной проекты, их не могли разрабатывать столь долго по незнанию основ MS Word.
так а в чем принципиальное отличие? распаковать zip и записать поля документа в xml — задача аналогичная проделанная вами
Я понял, вы хотите в шаблоне документа вначале наплодить полей документа, вставить их в нужные места в доке, а потом заменить сами определения полей.

Неплохо, но что делать с генерацией таблиц, циклами, условным выводом и т.п.?
Скриптлеты это делать могут легко.

И еще, написать скриптлет с актутальным кодом проще, чем делать двойную работу:
1) формирование поля документа, его использование в теле дока,
2) формирование маппинга "имя поля документа<-> данные".
При этом в метку можно вставить только строку, а скриптлет оперирует реальными объектами.
docx — по сути это набор XML файлов упакованных в формате ZIP. Распакуйте его и найдете много вкусного, в т.ч. ответы на поставленные вопросы.

У нас была похожая задача — решилась использованием слияний и XSLT преобразований.
Скажите, вы статью читали?

Я распаковал архив документа, нашел там xml, преобразовал его как мне было нужно.

Вопросы у меня были к полям документа.
читал, конечно.
возможно, у вас получился более универсальный способ, чем «стандартный», но во всех случаях, что возникали у нас, достаточно было использования Word Content Control Toolkit.

Кратко подход был таким (очень похож на ваш, но не во всём)

1. при помощи MS Word и Word Content Control Toolkit готовилась форма для заполнения
2. программа обработки данных распаковывала docx
3. При помощи XSLT преобразования получались данные из формуляра/записывались обратно
4. docx запаковывался обратно

как-то так :)
А п. 3 делает Word Content Control Toolkit или вы сами?
Т.е. для пользователя шаги это приготовить форму + предоставить данные или что-то еще дополнительно?
п.1 делается при настройке системы.
п.2 и 3 выполняются автоматически в программе, которая является потребителем данных от пользователя.
иногда данные отправляются пользователю обратно в обработанном виде, поэтому есть п.4.

для полной картины я забыл написать ещё один пункт:

п.1.1. Пользователь при помощи Word вносит в документ информацию. Разрешён ввод только в поля — ничего другого он менять не может.
Не хочу показаться занудным :) Groovy / Grails и в целом Java не мой инструмент, только в процессе изучения. Но из коробки подключить не получилось.

Подход интересный. Сейчас под php есть необходимость решить подобную задачу. Пока идем по схожему с вами пути (но там еще другие причины есть — шаблоны будут готовить простые смертные, которым проще вставить %Author% нежели работать с инструментами MS Word).

Собственно с этими целями и пытался посмотреть.

PS Если будет желание и возможность помочь запустить — буду благодарен :)

PPS Не бейти меня и не ругайте, мои руки не претендуют на прямолинейность в java. Совсем недавно изучаю.
Only those users with full accounts are able to leave comments. Log in, please.