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

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

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

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

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Выяснили, как использовать элементы управления контентом для генерации документов и как заполнять данные из 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);
                }
            }

        }
    }
}

Вот и все!

0 голосов
/ 01 мая 2018

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

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

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

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

...