У меня есть XML-файл с данными, которые мне нужно заполнить в документе Word.
Мне нужно найти способ определить шаблон, который можно использовать в качестве базовой линии для заполнения данных из файла XML и создания выходного документа.
Я считаю, что есть два способа сделать это.
Я просто не знаю подробностей, как реализовать в любом случае. Или не уверен, что есть другой, более простой способ выполнить эту задачу.
Может ли кто-нибудь показать пример того, как это можно реализовать. Достаточно простого примера.
Я предпочитаю C# для любого кода. Я использую Word 2016, но хочу, чтобы он был совместим от Word 2007 до Word 2016 и всего, что между ними, если это возможно, поскольку пользователи будут использовать эти версии. Спасибо!
Спасибо! пытаюсь обойтись без сторонних инструментов :)
Хорошо, нашел здесь подробное руководство по использованию XSLT в качестве шаблона для создания документа Word: Использование XSLT и Open XML для создания документа Word 2007.
Похоже, что хотя эта статья предназначена для Word 2007, она отлично работает в Word 2016.
Единственная проблема с этим методом заключается в том, что если позже потребуются изменения в шаблоне, требуется много усилий для обновления файла xslt, и это неудобно для пользователя, поскольку он не может быть обновлен в самом Word и фактическом XML документа. нужно манипулировать.
С другой стороны, создание документов ОЧЕНЬ гибкое со всеми возможностями, доступными через XSL (foreach, переменные, условия if и т. д.)
Выяснили, как использовать элементы управления содержимым для создания документов и как вставлять данные из XML в элементы управления содержимым. Я разделил это на 2 части:
Я использовал следующий 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 и без какой-либо третьей стороны. инструменты!
При этом используется рекомендованный 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);
}
}
}
}
}
Это оно!
Итак, где используется «outputDocument»? Похоже, вы изменяете только исходный "templateDocument" в Части 2.
Просто быстрое обновление. Вместо использования opendoc sdk вы также можете добавить пакет Nuget DocumentFormat.OpenXml в свое приложение для запуска кода.
Мы создали автоматизированный способ заполнения данных XML-файла в документе Word или PowerPoint. Мы используем надстройку, которая использует элементы управления содержимым, чтобы связать содержимое Excel (диапазоны, таблицы, диаграммы, фигуры и т. д.) С Word или PowerPoint. Ссылки портативны и надежны. Также легко обновить, если вам нужно внести какие-либо изменения в ваши документы. Вы можете найти надстройку через приложение Excel - просто выполните поиск надстроек «Автоматизация преобразования документов из Excel в Word» через «Получить надстройки» на вкладке «Вставка». Вы также можете узнать об этом больше здесь.
есть инструменты для создания шаблонов, такие как DocumentAssembler и docxtemplater.com