Выяснили, как использовать элементы управления контентом для генерации документов и как заполнять данные из XML в элементы управления контентом. Я разделил это на 2 части:
- Часть 1. Создание шаблона документа для создания документа
- Часть 2. Использование кода в C # для генерации документов на основе шаблона
<Ч />
Часть 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-файла в любом месте, чтобы его можно было импортировать в шаблон, который вы собираетесь создать.
Убедитесь, что на вашей копии Word включена вкладка Developer
[File
-> Options
-> Customize Ribbon
-> Под Customize the Ribbon
, убедитесь, что выбран Developer
-> OK
]. Подробности: Как: показать вкладку разработчика на ленте
Создайте новый документ Word (или используйте существующий документ Word), который будет вашим шаблоном для генерации документов.
На вкладке Developer
нажмите XML Mapping Pane
. Откроется XML Mapping Pane
с правой стороны документа.
На панели сопоставления XML выберите раскрывающийся список Custom XML Part
-> Выбрать (Add new part)
.
Выберите файл XML, который вы сохранили на шаге 1 -> Open
.
В области сопоставления XML выберите раскрывающийся список Custom XML Part
-> выберите элемент с текстом, который был в атрибуте xmlns
пользовательского файла XML. Если вы используете пример файла выше, это будет http://CustomDemoXML.htm
.
Добавьте статический текст в документ Word и добавьте Plain Text Content Control
рядом с ним (на вкладке Developer
-> Controls
. Повторите для всех полей, которые нужно добавить.
Для примера XML выше у меня был следующий документ Word:
- Нажмите на первую
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 и без любые сторонние инструменты!
- Сохраните ваш шаблон документа.
<Ч />
Часть 2. Использование кода в C # для генерации документов на основе шаблона
При этом используется рекомендованный Microsoft OpenXML SDK для создания документов с использованием файла XML, содержащего реальные данные.
Создайте свой XML-файл / откройте существующий XML-файл, с помощью которого можно сгенерировать документ из шаблона, созданного выше. Он должен быть в том же формате, что и образец XML-файла, использованного для создания шаблона.
Используйте OpenXML SDK для удаления любых элементов CustomXMLPart
из документа. Это предполагает, что никакие другие пользовательские части XML не используются в документе, как в этом примере. Для сложных сценариев вы можете при необходимости удалить отдельные части XML.
Используйте 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);
}
}
}
}
}
Вот и все!