Nuestro team de redactores ha estado mucho tiempo investigando para darle resolución a tus preguntas, te compartimos la respuesta y nuestro objetivo es serte de mucha apoyo.
Solución:
Descubrí cómo usar controles de contenido para generar documentos y cómo completar datos de un XML en controles de contenido. He dividido esto en 2 partes:
- Parte 1: Cree su documento de plantilla para la generación de documentos
- Parte 2: use código en C# para generar documentos basados en una plantilla
Parte 1: Cree su documento de plantilla para la generación de documentos
- Cree un XML de muestra a partir del cual pueda crear la plantilla de Word para la generación de documentos. Preferiblemente comience con una versión menos complicada para acostumbrarse.
Usé el siguiente XML para las pruebas. Para las pruebas no tenía secciones repetitivas, imágenes, etc.
This is the value in field1 from the XML file
This is the value in field2 from the XML file
This is the value in field3 from the XML file
Nota 1: Esto será solo un XML de muestra para crear su plantilla de Word. Los archivos XML con datos reales en este mismo formato se pueden aplicar posteriormente al generar documentos de Word a partir de la plantilla.
Nota 2: Él xmlns
attribute puede contener literalmente cualquier cosa que desee y no tiene que ser una URL que comience con http.
Guarde su archivo XML de muestra en cualquier ubicación para que pueda importarse a la plantilla que está a punto de crear.
-
Asegúrate que
Developer
la pestaña está habilitada en su copia de Word [File
->Options
->Customize Ribbon
-> UnderCustomize the Ribbon
, make sureDeveloper
is selected ->OK
]. Detalles: Cómo: Mostrar la pestaña Desarrollador en la cinta -
Cree un nuevo documento de Word (o use un documento de Word existente) que será su plantilla para la generación de documentos.
-
Sobre el
Developer
pestaña, haga clic enXML Mapping Pane
. Esto abrirá elXML Mapping Pane
en el lado derecho del documento. -
En el Panel de mapeo XML, seleccione el
Custom XML Part
desplegable -> Seleccionar(Add new part)
. -
Seleccione el archivo XML que guardó en el paso 1 ->
Open
. -
En el Panel de mapeo XML, seleccione el
Custom XML Part
menú desplegable -> Seleccione el elemento con el texto que estaba en elxmlns
attribute del archivo XML personalizado. Si usa el archivo de muestra anterior, seríahttp://CustomDemoXML.htm
. -
Añadir un poco static texto a un documento de Word y agregar un
Plain Text Content Control
al lado (en elDeveloper
pestaña ->Controls
sección. Repita para todos los campos que necesite agregar.
Para el XML de muestra anterior, tenía el siguiente documento de Word:
- Haga clic en el primero
Plain Text Content Control
-> En el Panel de asignación XML, haga clic con el botón derecho en el campo que desea asignar a ese control de contenido -> Haga clic enMap to Selected Content Control
. Repita para todos los campos que desea mapear.
Nota: Alternativamente, en lugar de agregar el Plain Text Content Control
elementos de la pestaña del desarrollador en el paso 8, puede hacer clic con el botón derecho en el campo que desea asignar en el Panel de asignación XML -> Hacer clic Insert Content Control
-> Haga clic en Plain Text
.
Del mismo modo, también puede agregar otros tipos de controles, como casillas de verificación, selectores de fecha e incluso secciones repetidas (¡también admite secciones repetidas anidadas! – desde Word 2013) y mapear datos de XML a aquellos que usan solo la funcionalidad nativa de Word y sin terceros. ¡instrumentos!
- Guarde su documento de plantilla.
Parte 2: use código en C# para generar documentos basados en una plantilla
Esto utiliza OpenXML SDK recomendado por Microsoft para generar documentos utilizando un archivo XML que contiene datos reales.
-
Cree su archivo XML/abra un archivo XML existente con el que generar un documento a partir de la plantilla creada anteriormente. Debe estar en el mismo formato que el archivo XML de muestra utilizado para crear la plantilla.
-
Utilice el SDK de OpenXML para eliminar cualquier
CustomXMLPart
elementos del documento. Esto supone que no se utilizan otras partes XML personalizadas en el documento, como es el caso en este ejemplo. Para escenarios complejos, puede eliminar partes XML específicas si es necesario. -
Use el SDK de OpenXML para agregar un nuevo
CustomXMLPart
basado en el archivo XML en el paso #1 anterior.
Aquí está el código de muestra que tengo para “actualizar”/”recargar” los datos de muestra en la plantilla con datos de un archivo XML que contiene datos reales (suponiendo que el archivo XML utilizado para generar el documento ya está creado y guardado):
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(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);
¡Eso es todo!
Ok, encontré una guía detallada sobre el uso de XSLT como plantilla para generar el documento de Word aquí: Uso de XSLT y Open XML para crear un documento de Word 2007.
Parece que aunque este artículo es para Word 2007, funciona perfectamente en Word 2016.
El único problema con este método es que si se necesitan cambios en la plantilla más adelante, se necesita mucho esfuerzo para actualizar el archivo xslt y no es fácil de usar, ya que no se puede actualizar en Word y en el XML real del documento. necesita ser manipulado.
En el lado positivo, la generación de documentos es MUY flexible con todo el poder disponible a través de XSL (foreach, variables, condiciones, etc.)