Позволяет создать документ из шаблона, обновить значения параметров документа, созданного из шаблона и показать какие параметры шаблона сохранены в созданном документе.
В репозиторий загружены два шаблона документа для примера. SimpleTemplate.docx - простой шаблон документа с одним параметром. SaleContractTemplate.docx - шаблон договора купли-продажи с большим количеством параметров.
Реализация основана на элементах управления содержимым, см. https://learn.microsoft.com/en-us/office/client-developer/word/content-controls-in-word.
В коде используется пакет для работы с OpenXML DocumentFormat.OpenXml, см. https://www.nuget.org/packages/DocumentFormat.OpenXml/3.0.1, репозиторий https://github.com/dotnet/Open-XML-SDK.
Для создания шаблона нужно создать документ в формате docx, расставить элементы управления содержимым в нужных местах и сохранить.
Движок привязан к работе с источником данных. Источником данных может быть любой объект со свойствами. Для того, чтобы связать элементы управления содержимым из docx документа используется Mapping. В Mapping указано каким образом должен заполнятся элемент управления содержимым. Информация хранится в виде MappingElement, который содержит два свойства ParameterName - имя элемента управления содержимого, и DataPath - специальная строка для получения значения свойства из источника данных, это может быть функция, или путь через цепочку значений свойств и т.п. Например, Author -> Name -> Accusative
В проекте не реализована реальная привязка к данным, а сделано обновление данных шаблона из пользовательского ввода консоли.
При создании документа на основе шаблона движок считает все заданные элементы управления содержимым и создаст на их основе Mapping для привязки к источнику данных. Полученный Mapping будет сохранен в созданный из шаблона документ в виде мета-информации. Сохранение Mapping реализовано на основе CustomFileProperties, см. https://learn.microsoft.com/en-us/office/open-xml/word/how-to-set-a-custom-property-in-a-word-processing-document.
В Р7-Офисе не реализована поддержка CustomFileProperties, поэтому при сохранении документа созданного из шаблона в редакторах Р7 информация о Mapping теряется.
Новый документ будет содержать в себе привязку параметров шаблона и то, как получать их значения из источника данных. Дальше шаблон документа уже не потребуется, новый документ от него не зависит, а сам шаблон может изменяться и это не повлияет на созданные на его основе документы.
Для обновления данных из источника у документа созданного из шаблона движок считывает Mapping из самого документа, получает мета-информацию. Движок находит все элементы управления содержимым и на основе Mapping получает значения из источника данных, устанавливая их в конкретный элемент управления содержимым.
Склонируйте репозиторий https://github.com/hankir/3aa59392-oxml-templates.git
Выполните сборку проекта командой
dotnet build
Перейдите в папку проекта и выполните команду для вызова помощи по всем доступным командам.
cd Template
dotnet run -- -h
Usage:
Template [command] [options]
Options:
--version Show version information
-?, -h, --help Show help and usage information
Commands:
create <template> <output> Create new document from template.
update <document> Update document templated values.
show <document> Show template mapping.
dotnet run -- create SimpleTemplate.docx doc.docx
Создаст документ из простого шаблона SimpleTemplate.docx с именем doc.docx.
dotnet run -- show doc.docx
Выведет в консоль параметры шаблона, которые были скопированы в документ при создании из шаблона.
dotnet run -- update doc.docx
Запросит пользовательский ввод значений параметров в консоли.
Некоторые редакторы теряют информацию о Mapping в документе, после этого обновление значение будет не доступно.
Для воспроизведения бага нужно выполнить следующую последовательность команд:
- Создать документ из шаблона.
dotnet run -- create SimpleTemplate.docx doc.docx
- Заполнить значение параметра документа.
dotnet run -- update doc.docx
- Проверить, что Mapping сохранен в документе.
dotnet run -- show doc.docx
- Открыть документ doc.docx в редакторе Р7-офис.
- Добавить любой текст в любое место документа и сохранить.
- Проверить Mapping в документе.
dotnet run -- show doc.docx
После того, как документ был сохранен в Р7-офисе Mapping потеряется и на экран будет вывыдено:
Template properties not found.