Skip to content

hankir/3aa59392-oxml-templates

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 

Repository files navigation

Интерфейс командной строки для проверки движка шаблонов

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

В репозиторий загружены два шаблона документа для примера. 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

Запросит пользовательский ввод значений параметров в консоли.

Проверка потери параметров в редакторах не Microsoft Office

Некоторые редакторы теряют информацию о Mapping в документе, после этого обновление значение будет не доступно.

Потеря Mapping в редакторе Р7-офис

Для воспроизведения бага нужно выполнить следующую последовательность команд:

  1. Создать документ из шаблона.
dotnet run -- create SimpleTemplate.docx doc.docx
  1. Заполнить значение параметра документа.
dotnet run -- update doc.docx
  1. Проверить, что Mapping сохранен в документе.
dotnet run -- show doc.docx
  1. Открыть документ doc.docx в редакторе Р7-офис.
  2. Добавить любой текст в любое место документа и сохранить.
  3. Проверить Mapping в документе.
dotnet run -- show doc.docx

После того, как документ был сохранен в Р7-офисе Mapping потеряется и на экран будет вывыдено:

Template properties not found.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages