Создание документа Word (docx) с использованием данных из файла XML / Преобразование XML в документ Word на основе шаблона

У меня есть XML-файл с данными, которые мне нужно заполнить в документе Word.

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

Я считаю, что есть два способа сделать это.

  1. Создайте файл XSLT, который будет «шаблоном», и используйте его для создания документов Word, используя его вместе с файлом XML.
  2. Используйте элементы управления содержимым в Word, чтобы создать шаблон документа и каким-либо образом сопоставить его с файлом XML.

Я просто не знаю подробностей, как реализовать в любом случае. Или не уверен, что есть другой, более простой способ выполнить эту задачу.

Может ли кто-нибудь показать пример того, как это можно реализовать. Достаточно простого примера.

Я предпочитаю C# для любого кода. Я использую Word 2016, но хочу, чтобы он был совместим от Word 2007 до Word 2016 и всего, что между ними, если это возможно, поскольку пользователи будут использовать эти версии. Спасибо!

есть инструменты для создания шаблонов, такие как DocumentAssembler и docxtemplater.com

Slai 03.05.2018 18:47

Спасибо! пытаюсь обойтись без сторонних инструментов :)

slayernoah 07.05.2018 16:55
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
10
2
35 009
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Хорошо, нашел здесь подробное руководство по использованию XSLT в качестве шаблона для создания документа Word: Использование XSLT и Open XML для создания документа Word 2007.

Похоже, что хотя эта статья предназначена для Word 2007, она отлично работает в Word 2016.

Единственная проблема с этим методом заключается в том, что если позже потребуются изменения в шаблоне, требуется много усилий для обновления файла xslt, и это неудобно для пользователя, поскольку он не может быть обновлен в самом Word и фактическом XML документа. нужно манипулировать.

С другой стороны, создание документов ОЧЕНЬ гибкое со всеми возможностями, доступными через XSL (foreach, переменные, условия if и т. д.)

Ответ принят как подходящий

Выяснили, как использовать элементы управления содержимым для создания документов и как вставлять данные из XML в элементы управления содержимым. Я разделил это на 2 части:

  • Часть 1. Создайте свой шаблон документа для создания документа.
  • Часть 2: Используйте код на C# для создания документов на основе шаблона

Часть 1. Создайте свой шаблон документа для создания документа.

  1. Создайте образец XML, на основе которого вы можете создать шаблон Word для создания документа. Желательно начать с менее сложной версии, чтобы понять ее.

Я использовал следующий XML для тестирования. Для тестирования у меня не было повторяющихся разделов, картинок и т. д.

<?xml version = "1.0" encoding = "utf-8"?>
<mydata xmlns = "http://CustomDemoXML.htm">
    <field1>This is the value in field1 from the XML file</field1>
    <field2>This is the value in field2 from the XML file</field2>
    <field3>This is the value in field3 from the XML file</field3>
</mydata>

Примечание 1: это будет просто образец XML для создания вашего шаблона Word. XML-файл (ы) с реальными данными в том же формате позже можно будет применить при создании документа (ов) Word из шаблона.

Заметка 2: Атрибут xmlns может содержать буквально все, что вы хотите, и это не обязательно должен быть URL, начинающийся с http.

Сохраните образец XML-файла в любом месте, чтобы его можно было импортировать в шаблон, который вы собираетесь создать.

  1. Убедитесь, что в вашей копии Word включена вкладка Developer [File -> Options -> Customize Ribbon -> В разделе Customize the Ribbon убедитесь, что выбрано Developer -> OK]. Подробности: Как: показать вкладку разработчика на ленте

  2. Создайте новый документ Word (или используйте существующий документ Word), который будет вашим шаблоном для создания документа.

  3. На вкладке Developer щелкните XML Mapping Pane. Это откроет XML Mapping Pane в правой части документа.

  4. На панели сопоставления XML выберите раскрывающийся список Custom XML Part -> Выбрать (Add new part).

  5. Выберите файл XML, который вы сохранили на шаге 1 -> Open.

  6. На панели сопоставления XML выберите раскрывающийся список Custom XML Part -> выберите элемент с текстом, который был в атрибуте xmlns настраиваемого файла XML. Если вы используете приведенный выше образец файла, это будет http://CustomDemoXML.htm.

  7. Добавьте статический текст в документ Word и добавьте рядом с ним Plain Text Content Control (на вкладке Developer -> раздел Controls. Повторите для всех полей, которые вам нужно добавить.

Для приведенного выше примера XML у меня был следующий документ Word:

sample word document template

  1. Щелкните первый Plain Text Content Control -> На панели сопоставления XML щелкните правой кнопкой мыши поле, которое вы хотите сопоставить с этим элементом управления содержимым -> Щелкните Map to Selected Content Control. Повторите эти действия для всех полей, которые хотите сопоставить.

Примечание: В качестве альтернативы, вместо добавления элементов Plain Text Content Control из вкладки разработчика на шаге 8, вы можете щелкнуть правой кнопкой мыши поле, которое вы хотите сопоставить, на панели сопоставления XML -> Щелкните Insert Content Control -> Щелкните Plain Text.

Точно так же вы также можете добавить другие типы элементов управления, такие как флажки, средства выбора даты и даже повторяющиеся разделы (он также поддерживает вложенные повторяющиеся разделы! - начиная с Word 2013) и сопоставить данные из XML с теми, которые используют только встроенные функции Word и без какой-либо третьей стороны. инструменты!

  1. Сохраните свой шаблон документа.

Часть 2: Используйте код на C# для создания документов на основе шаблона

При этом используется рекомендованный Microsoft OpenXML SDK для создания документов с использованием XML-файла, содержащего реальные данные.

  1. Создайте свой XML-файл / откройте существующий XML-файл, чтобы сгенерировать документ из шаблона, созданного выше. Он должен быть в том же формате, что и образец XML-файла, использованного для создания шаблона.

  2. Используйте OpenXML SDK для удаления любых элементов CustomXMLPart из документа. Это предполагает, что в документе не используются никакие другие настраиваемые части XML, как в этом примере. В сложных сценариях при необходимости можно удалить определенные части XML.

  3. Используйте OpenXML SDK, чтобы добавить новый CustomXMLPart на основе файла XML на шаге № 1 выше.

Вот пример кода, который я должен «обновить» / «перезагрузить» для образцов данных в шаблоне данными из XML-файла, содержащего реальные данные (при условии, что XML-файл, используемый для создания документа, уже создан и сохранен):

using System.IO;
using DocumentFormat.OpenXml.Packaging;

namespace SampleNamespace
{
    public static class SampleClass
    {
        public static void GenerateDocument()
        {
            string rootPath = @"C:\Temp";
            string xmlDataFile = rootPath + @"\MyNewData.xml";
            string templateDocument = rootPath + @"\MyTemplate.docx";
            string outputDocument = rootPath + @"\MyGeneratedDocument.docx";

            using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(templateDocument, true))
            {
                //get the main part of the document which contains CustomXMLParts
                MainDocumentPart mainPart = wordDoc.MainDocumentPart;

                //delete all CustomXMLParts in the document. If needed only specific CustomXMLParts can be deleted using the CustomXmlParts IEnumerable
                mainPart.DeleteParts<CustomXmlPart>(mainPart.CustomXmlParts);

                //add new CustomXMLPart with data from new XML file
                CustomXmlPart myXmlPart = mainPart.AddCustomXmlPart(CustomXmlPartType.CustomXml);
                using (FileStream stream = new FileStream(xmlDataFile, FileMode.Open))
                {
                    myXmlPart.FeedData(stream);
                }
            }

        }
    }
}

Это оно!

Итак, где используется «outputDocument»? Похоже, вы изменяете только исходный "templateDocument" в Части 2.

Dimitris.K 22.04.2020 14:55

Просто быстрое обновление. Вместо использования opendoc sdk вы также можете добавить пакет Nuget DocumentFormat.OpenXml в свое приложение для запуска кода.

Tiklu Ganguly 28.09.2020 15:56

Мы создали автоматизированный способ заполнения данных XML-файла в документе Word или PowerPoint. Мы используем надстройку, которая использует элементы управления содержимым, чтобы связать содержимое Excel (диапазоны, таблицы, диаграммы, фигуры и т. д.) С Word или PowerPoint. Ссылки портативны и надежны. Также легко обновить, если вам нужно внести какие-либо изменения в ваши документы. Вы можете найти надстройку через приложение Excel - просто выполните поиск надстроек «Автоматизация преобразования документов из Excel в Word» через «Получить надстройки» на вкладке «Вставка». Вы также можете узнать об этом больше здесь.

Другие вопросы по теме