Заполнение шаблона word на сервере без использования ms office
Исполняем обязанности по получению сведений о своих бенефициарных владельцах
Небольшая вводная
Начиная с 21 декабря 2016 года вступили изменения в ФЗ РФ «О противодействии легализации (отмыванию) доходов, полученных преступным путем, и финансированию терроризма», касательно обязанности юридического лица по раскрытию информации о своих бенефициарных владельцах. В связи с этим, многие компании направляют запросы по цепочке владения с целью выяснения своих бенефициарных владельцев. Кто-то формирует запросы на бумаге, кто-то рассылает электронные письма.
На наш взгляд, надлежащим доказательством исполнения обязанности «знай своего бенефициарного владельца» является наличие письма на бумаге с отметкой об отправке/вручении. Данные письма в идеале должны готовиться не реже одного раза в год. Если в ведении юриста находится всего несколько компаний, то составление писем не составляет особого труда. Но, если компаний больше 3-х десятков, составление писем превращается в уничтожающую позитив рутину. Дело усугубляется тем, что реквизиты писем постоянно меняются: подписанты увольняются, компании перерегистрируются, меняя адреса. Все это надо учитывать. Как здесь могут помочь навыки программирования на python?
Очень просто — хорошо бы иметь программу, которая сама будет подставлять в письма необходимые реквизиты. В том числе формировать сами письма, не заставляя создавать документ за документом вручную. Попробуем.
Структура письма в word. Модуль python docxtpl
Перед написанием кода программы посмотрим как должен выглядеть шаблон письма, в который мы будем помещать наши данные.
Текст письма от общества своему участнику/акционеру будет примерно следующим:
Напишем простую программу, которая заполнит для начала одно поле в нашем шаблоне, чтобы понять принцип работы.
Для начала в самом шаблоне письма Word вместо одного из полей, например, подписанта поставим переменную. Данная переменная должна быть на либо на англ. языке, либо на русском, но в одно слово.Также переменная должна быть обязательно заключена в двойные фигурные скобки. Выглядеть это будет примерно так:
Сама программа будет иметь следующий вид:
Вначале мы импортируем модуль для работы с документами формата Word. Далее мы открываем шаблон, и в поле директор, которое бы обозначили ранее в самом шаблоне, вносим ФИО директора. В конце документ сохраняется под новым именем.
Таким образом, чтобы заполнить все поля в файле-шаблоне Word нам для начала необходимо определить все поля ввода в самом шаблоне скобками <> вместе с переменными и потом написать программу. Код будет примерно следующим:
На выходе при исполнении программы мы получим готовый заполненный документ.
Стандартная поставка системы DIRECTUM содержит полезный механизм "Конструктор документов". При минимуме разработки он формирует типовые и не очень документы из заранее подготовленных т.н. макетов. Макеты представляют собой документы с обозначенными местами для вставки текста. Как это работает: путём нехитрых манипуляций разрабатывается обобщённый макет - шаблон будущих документов. В нужном месте автоматизируемого процесса на основе полученных нужных данных (например, у пользователя в мастере действий) и заранее подготовленного макета прикладная функция GenerateDocument() формирует готовый документ.
Как раз об оптимизации логики формирования документов из макетов и поговорим дальше.
Как работает функция GenerateDocument()?
В функции при помощи COM-объекта Word.Application (ну или Excel.Application) происходят манипуляции с макетом, наполнение его нужными данными. При создании объекта Word.Application происходит запуск процесса WINWORD.EXE, в память загружается документ и происходит обработка.Так вот формирование документа из стандартного макета протокола совещания таким способом на моём рабочем ПК занимает около 5 секунд. А в подавляющем большинстве случаев использования, по требованиям процесса, в прикладных вычислениях по соседству с генерацией выполняются другие затратные по времени операции: создание документа из файла, создание, заполнение и отправка задачи. Кроме этого требуется выполнять поиски, перебирать детальные разделы, делать вынужденные преобразования и т.д., создающие "фон" на свои полсекунды-секунду.
Как быть? Оптимизировать вычисления.
Но есть действия, время и оптимальность выполнения которых не всегда зависит от прикладной разработки. Так, на скорость создания документа на сервере повлияет "ширина канала" до сервера (передаётся тело документа). А для эффективной работы с содержимым документов при формировании документов из макетов приходится использовать тяжёлые офисные COM-объекты - наш случай.
Что-нибудь ещё кроме времени выполнения функции GenerateDocument()? Да. Формирование документов может выполняться на стороне службы workflow и сервере веб-доступа. В некоторых ситуациях операции генерации документов - массовые, сталкивался лично на одном из проектов. И имеют место быть:
- неидеальная стабильность работы тяжёлых COM-объектов при многочисленных вызовах;
- необходимость установки пакета MS Office версии 2007 и выше;
- необходимость первоначальной настройки запуска процессов Word и Excel от конкретного пользователя.
Это вызывает дополнительное беспокойство администратора.
Оптимизируем
Результатом реализации идеи стала COM-библиотека DocXConstructor.dll с простым интерфейсом:
- вызовом метода AddMacro(string key, string value) в библиотеку передаются наименования макропеременных и значения;
- метод UpdateMacros(string inputFilePath, string outputFilePath) из макета по пути inputFilePath формируется готовый документ по пути outputFilePath.
Но есть исключения-ограничения:
- В сформированный документ не попадает красный текст МАКРОПЕРЕМЕННАЯ НЕ ОЗНАЧЕНА, если не передано значение макроподстановки. Наверное, такой текст полезен для отладки, но я решил это исключить. Теперь при разработке не требуется передавать пустые строки в качестве значений макропеременных.
- Не поддерживается формирование документов Excel (.xlsx). Для формирования таблиц рекомендую использовать генерацию из шаблона. (Коллеги, поделитесь знаниями, возможно ли формирование документов Word как в указанной статье? Скорее всего нет, но я сходу не нашёл чёткого ответа, почему.)
В дополнение к самой библиотеке я написал функцию GenerateDocumentFasterWithMoreEnergy() для работы с DocXConstructor.dll. Функция формирует из макетов только .docx документы или генерирует исключение. Чтобы опробовать работу оптимизированного формирования документов из макетов вместо вызова GenerateDocument(), предварительно проверив расширение файла, вызывайте GenerateDocumentFasterWithMoreEnergy(), по параметрам они идентичны.
На компьютерах, где документы будут генерироваться из макета по-новому (на сервере workflow и/или на рабочих местах пользователей) распакуйте архив в нужное вам место и запустите register.bat для регистрации библиотеки из папки DocXConstructor. Чтобы разрегистрировать библиотеку запустите unregister.bat. Функция GenerateDocumentFasterWithMoreEnergy() в виде пакета разработки доступна в папке dev архива.
Установленный и настроенный Microsoft Office для работы DocXConstructor.dll не требуется. Это полезно там, где используются отличные от Microsoft Office офисные пакеты.
Исправление пожеланий к решению возможно, но не гарантируется.
Прошу в комментариях оставить мнение о полезности решения. Планируете ли использовать это решение на своих проектах?
Обработать шаблон документа Word на сервере это проблема, с которой уверен сталкивались многие. Библиотека стандартных подсистем делает обработку шаблона на клиенте, а это исключает веб интерфейс и рабочие места, где нет MS Office. При попытке в Word открыть шаблон файла под серверным пользователем, возникают проблемы с доступом. Не отрицаю существования таких настроек на сервере, при которых это возможно, но в моем случае речь шла о массовом продукте.
Чтобы избавиться от всех прелестей этой прекрасной пары 1с+Word, решил отказаться от Word, хотя над первым может тоже стоило подумать?
Всю красоту парсинга XML , из 1с уверен, вы сможете или уже смогли оценить в своей работе.
Результатом решения стал общий модуль осуществляющий всю работу по заполнению шаблона.
Общий модуль, для простоты скачивания поместил в модуль обработки.
Процедура ответственная за заполнение шаблона:
ОбработатьФайл Docx (ФайлШаблона,ПараметрыЗаполнения, ШаблоныКЗамене)
Колонка «Результат» из «ШаблоныКЗамене» может иметь тип: "Строка" или "Массив" (содержащий строки).
ШаблоныКЗамене имеет строки:
ИмяПараметраВWord = «массив 1» , Результат(массив) содержит два значения: (" Значение 1 массив 1 "; " Значение 2 массив 1" ,
ИмяПараметраВWord = «массив 2», Результат(массив) содержит три значения:(" Значение 1 массив 2";"Значение 2 массив 2";"Значение 3 массив 2") :
Пример шаблона в таблице word :
Значение 1 массив 1
Значение 1 массив 2
Значение 2 массив 1
Значение 2 массив 2
Значение 3 массив 2
ШаблоныКЗамене имеет строку:
ИмяПараметраВWord = «МассивЧленыКомиссии» ; Результат(массив) содержит значения: ("Прохоров Сергей Петрович"; "Петров Адрей Федорович"; "Смирнов Антон Викторович")
Шаблон:
Результат:
Прохоров Сергей Петрович
Петров Адрей Федорович
Смирнов Антон Викторович
Жду ваших комментариев и предложений.
Модуль можете использовать для коммерческого использования, однако прошу не удалять ссылку на мои реквизиты.
Related Posts
27 Comments
В конфигурации, разработанной нашей конторой по заказу одного госучреждения, прямое потрошение парсинг шаблонов Word для генерации договоров и прочего барахла работает с 2013 года. Только механизм вставки таблиц там довольно слабый. Скорее его нет, чем есть.
С макетами сформированными в формате docx отличным от 2010 office будет работать? Например в макете созданным и сохраненным в 2016 word?
Спасибо, работает! Только добавьте в описание, что в макете после параметров нужно добавлять пробел, иначе параметр не отображается на печати.
В разработке корпоративных приложений очень часто приходится решать задачу выгрузки данных в документы — от небольших справок до больших отчетов.
Хочу поделиться нашим opensource-решением для генерации docx документов, которое позволяет заполнять документы по шаблону, оформление которого можно менять в Word без переписывания кода.
Для начала — немного вводных.
Что нам было нужно от шаблонизатора
- Шаблон создается в Word и сразу видно, на что будет похож результирующий документ, шаблон без лишнего мусора.
- Результирующий документ после скачивания содержит все необходимые данные, не подтягивая их с внешних источников.
- Возможность заполнять списки, таблицы, и иногда еще и таблицы с вложенными в них списками.
- Шаблон можно доверить секретарю клиента, чтобы он мог сменить логотип, реквизиты компании, или как-либо еще подкорректировать оформление. И все это уже после сдачи проекта, не модифицируя наш код.
Поиски шаблонизатора
Что получилось у нас
Со стороны кода мы работаем с привычными сущностями, такими как «Таблица», «Список», «Строка», «Ячейка».
Со стороны шаблона используется документ с расставленными по нему Content Controls, которые связаны с данными через свойство tag. Content Controls добавляются достаточно легко, при этом их достаточно сложно испортить при дальнейшей эксплуатации в отличие от текстовых вставок типа , а при отключенном режиме конструктора спец-обозначений контролов и вовсе не видно.
Например, необходимо заполнить таблицу, указать дату её заполнения и количество записей.
Создадим шаблон этой таблицы в Word-документе:
- Переходим на вкладку «Разработчик» (если она отсутствует, включается через Файл → Параметры → Настроить ленту → Ставим галочку возле «Разработчик») и включаем режим конструктора.
- Выделяем текст, который будет заполняемым полем.
- Нажимаем «Вставить элемент управления содержимым «Форматированный текст».
- Нажимаем «Свойства» и заполняем поля «Название» и «Тег».
Если требуется заполнить таблицу или список, их также нужно поместить в отдельный контент-контрол.
Так выглядит шаблон с добавленными элементами управления содержимым:
Теперь заполним шаблон данными:
нам нужно добавить одно поле и одну таблицу с двумя строчками, и в футере таблицы указать количество записей.
Если всё получилось, на выходе следующий документ:
С помощью метода SetRemoveContentControls(bool value) можно удалить элементы управления содержимым, если они уже не нужны в результирующем документе.
TemplateEngine.Docx позволяет заполнять простые поля, таблицы, списки, вложенные списки, таблицы со списками, списки с таблицами и даже списки с таблицами, в которых есть списки… Структура класса Content позволяет создавать шаблоны с неограниченной вложенностью элементов.
Еще больше примеров!
Заполнение простых полей
Заполнение вложенных списков
Таблица внутри списка
Список внутри таблицы
Таблица, состоящая из нескольких блоков, которые заполняются независимо
Таблица с объединенными вертикально ячейками
Таблица с объединенными горизонтально ячейками
Где скачать
Всем спасибо за внимание, надеемся, что данный инструмент поможет вам в ваших проектах.
«Корпорация Зла» (joke) осваивает нишу совместной работы с документами уже второе десятилетие. Начиналось всё с ранних версий SharePoint, при упоминании которых котики поопытнее сразу начинают плакать – уж больно специфичен с точки зрения и настроек, и возможностей был в те далекие годы MS SP. Ладно, не будем больше травмировать друг друга воспоминаниями о том неуклюжем монстре…
Но упорства у Microsoft не занимать – работа по улучшению ситуации велась все это время, причем сразу на нескольких фронтах. В результате сейчас можно говорить о сложившейся инфраструктуре совместной работы с документами, которую предлагает Microsoft. В ней выделяются два класса софта:
- Средства коллективного доступа к документам, включающие в себя каталогизацию, управление версиями, раздачу прав и тому подобные серверные фичи. Эти средства, в свою очередь, подразделяются на облачные (OneDrive, SharePoint Online) и on-premise, то есть разворачиваемые в инфраструктуре самого заказчика — сервер SharePoint 2016.
- Средства редактирования документов. К ним относятся: десктопное семейство Microsoft Office (тоже сильно переработанное за последнее время), свежесочиненные мобильные версии Office, изначально ориентированные на совместную работу с документами, и, вишенкой на торте – собственная реализация сервера онлайн-редактирования документов Office Online apps (несколько ранее известного под именем Office Web Apps).
В итоге у нас появилась идея рассказать, как собственно об этих возможностях, так и о том, как все это хозяйство установить и настроить. Попробуем добраться и до сравнения с альтернативными сервисами. Поскольку понятно, что такой лонгрид и писать долго, и читать его осилит не каждый, мы решили разделить это на несколько статей. Эта – первая. И в ней дальше мы пройдемся по тем фичам и особенностям, которые есть у каждого из продуктов Microsoft, обеспечивающих совместное редактирование документов: Office Online, MS Office на десктопах и он же на мобильных устройствах. Сразу предупреждаю – дальше будет много внимания к деталям и разжевывания мелких особенностей, нетерпеливый читатель может сразу прочитать «выводы» в конце заметки, для остальных – поехали.
Office Online
Office Online Server – это довольно интересное приложение, про которое не все еще хорошо знают. Во-первых, это возможность сократить количество лицензий и установок MS Office. Во-вторых, расширение возможности доступа и редактирования документа, грубо говоря – нужен только браузер. В-третьих, это самые лучшие на сегодня у Microsoft возможности совместной работы. Давайте посмотрим, о чем я.
Word Online
Excel Online
В Excel Online изменения в ячейке отобразятся у других соавторов только при переходе первого на следующую ячейку. При этом ячейки не блокируются и вносить изменения могут сразу несколько пользователей.
PowerPoint Online
PowerPoint Online позволяет работать одновременно над одним слайдом, но лучше работать над разными элементами, иначе пользователи не видят real time изменений друг друга.
Настольная версия Office
Опыт совместной работы с документами через Office Online оставляет приятные впечатления, когда речь идет о правках текста без необходимости значительных изменений форматирования. Если вам захочется вставить диаграммы, smart art, оглавление, макросы, форматировать таблицы, использовать формулы и т.д. тут придётся использовать настольную версию программ. О разнице функционала настольной версии и online можно писать отдельную статью. Здесь же рассмотрим отличия, связанные с совместной работой.
MS Word
При редактировании в настольной версии программы блокируется абзац, над которым работает другой пользователь.
Вносимые изменения станут видны другим соавторам только после их сохранения автором и обновления документа остальными пользователями.
Сохранение-обновление объединено в кнопке Save (Ctrl+S) Наличие обновлений индицируется иконкой напротив имени автора.
MS Excel
В случае с Excel возможности одновременной работы над документом нет. Нам предлагают либо всем перейти в онлайн версию –
либо встать в очередь —
MS PowerPoint
Напротив, в PowerPoint ни блокировки, ни обозначения элемента, над которым работает другой пользователь нет. Так что, о том, что кто-то ещё работает над той же презентацией, вы можете понять разве что через панель Share.
Наличие обновлений сигнализируется малоприметным статусом Updates Available. Статус появляется только после сохранения изменений автором, сами изменения появляются после обновления документа с помощью Save (Ctrl+S).
Мобильные устройства
Microsoft Word App и Microsoft PowerPoint App
При работе на Android абзац или элемент, над которым работает пользователь, не блокируется и возможна одновременная работа с ним, но и ничего не подсвечивается для других соавторов, Правки отображаются без дополнительных действий с небольшой задержкой. То, что кто-то другой работает над этим же элементом, можно видеть в меню “Share”.
Интересно было бы ещё протестировать на Windows Phone с Windows 10. Но в компании таких не нашлось.
Microsoft Excel App
Совместная работа real time в Excel App не поддерживается.
Выводы
В целом, функциональность совместного редактирования документов от Microsoft можно считать состоявшейся, хотя разные компоненты реализуют ее по-разному. Сам по себе процесс совместного редактирования лучше всего реализован в Office Online – это реальный co-working. В список вещей, на которые можно смотреть вечно, добавлю себе движущиеся по экрану флажки с именами коллег и постепенно заполняющийся сам по себе документ. Но, к сожалению, за полноценным функционалом редактирования как такового по-прежнему придётся обращаться к настольным версиям программ, в которых ещё осталась и нужна кнопка сохранения, а также не так удобно реализован процесс совместной работы (больше всего пока страдает Excel, где все так и осталось на уровне чекина-чекаута).
В следующей заметке мы расскажем, как осуществить процесс разворачивания on-premise компонент совместного доступа в корпоративной инфраструктуре. Ферма SharePoint 2016, Office Online Server, публикация – вот это все. Не отключайтесь.
Читайте также: