Abrir y agregar texto en un documento de procesamiento de texto
En este tema se muestra cómo usar las clases del SDK de Open XML para Office para abrir y agregar texto a un documento de procesamiento de Word mediante programación.
Procedimiento para abrir un documento y agregarle texto
El SDK de Open XML le ayuda a crear Word procesamiento de contenido y estructura de documentos mediante clases fuertemente tipadas que corresponden a elementos WordprocessingML. En este tema se muestra cómo usar las clases del SDK de Open XML para abrir un documento de procesamiento de Word y agregarle texto. Además, en este tema se presenta la estructura de documento básica de un documento WordprocessingML, los elementos XML asociados y las clases correspondientes del SDK de Open XML.
Creación de un objeto WordprocessingDocument
En Open XML SDK, la clase WordprocessingDocument representa un paquete de documentos de Word. Para abrir y trabajar con un documento de Word, cree una instancia de la clase WordprocessingDocument desde el documento. Después de crear la instancia desde el documento, puede obtener acceso a la parte de documento principal que contiene el texto del documento. En el paquete, el texto de la parte de documento principal se representa como XML mediante marcado WordprocessingML.
Para crear la instancia de clase a partir del documento, llame uno de los métodos Open. Se proporcionan varios, cada uno con una firma diferente. El código de ejemplo en este tema usa el método Open(String, Boolean) con una firma que requiere dos parámetros. El primer parámetro lleva una cadena de ruta de acceso completa que representa el documento para abrir. El segundo parámetro es true o false y representa si desea que el archivo se abra para su edición. Los cambios que realice en el documento no se guardarán si el valor de este parámetro es false.
En el siguiente ejemplo de código, se llama al método Open.
// Open a WordprocessingDocument for editing using the filepath.
WordprocessingDocument wordprocessingDocument =
WordprocessingDocument.Open(filepath, true);
Cuando haya abierto el paquete de documentos de Word, puede agregar texto al elemento de documento principal. Para tener acceso al cuerpo del elemento de documento principal, asigne una referencia al cuerpo del documento existente, como se muestra en el siguiente ejemplo de código.
// Assign a reference to the existing document body.
Body body = wordprocessingDocument.MainDocumentPart.Document.Body;
Estructura de un documento WordProcessingML
La estructura de documento básica de un documento WordProcessingML contiene los elementos document y body, seguidos de uno o varios elementos a nivel de bloque, como p, que representa un párrafo. Un párrafo contiene uno o varios elementos r. La r representa a run (segmento), que es una región de texto con un conjunto de propiedades comunes, como el formato. Un segmento contiene uno o varios elementos t. El elemento t contiene un intervalo de texto. En el siguiente ejemplo de código se muestra el marcado WordprocessingML de un documento que contiene el texto "Example text".
<w:document xmlns:w="https://schemas.openxmlformats.org/wordprocessingml/2006/main">
<w:body>
<w:p>
<w:r>
<w:t>Example text.</w:t>
</w:r>
</w:p>
</w:body>
</w:document>
Con el SDK de Open XML, puede crear contenido y estructura de documentos mediante clases fuertemente tipadas que corresponden a elementos WordprocessingML . Puede encontrar estas clases en el espacio de nombres DocumentFormat.OpenXml.Wordprocessing . La tabla siguiente muestra los nombres de las clases que corresponden a los elementos document, body, p, r y t.
Elemento de WordprocessingML | Open XML SDK (clase) | Descripción |
---|---|---|
documento | Document | El elemento raíz del elemento de documento principal. |
body | Body | El contenedor de las estructuras a nivel de bloque, como párrafos, tablas, anotaciones y otras recogidas en la especificación ISO/IEC 29500. |
p | Paragraph | Un párrafo. |
r | Run | Un segmento. |
t | Text | Un intervalo de texto. |
Para obtener más información sobre la estructura general de los elementos y elementos de un documento WordprocessingML, vea Estructura de un documento WordprocessingML.
Generación del marcado WordprocessingML para agregar el texto
Cuando tenga acceso al cuerpo del elemento de documento principal, agregue texto mediante la adición de instancias de las clases Paragraph, Run y Text. Esto genera el marcado WordprocessingML requerido. En el siguiente ejemplo de código, se agrega el párrafo, el segmento y el texto.
// Add new text.
Paragraph para = body.AppendChild(new Paragraph());
Run run = para.AppendChild(new Run());
run.AppendChild(new Text(txt));
Código de ejemplo
El método de ejemplo OpenAndAddTextToWordDocument que se muestra se puede usar para abrir un documento de Word y anexarle texto con Open XML SDK. Para llamar este método, pase un nombre de archivo de ruta de acceso completa como primer parámetro, y el texto que se debe agregar, como segundo parámetro. Por ejemplo, el siguiente ejemplo de código abre el archivo Letter.docx de la carpeta Documentos públicos y le agrega texto.
string strDoc = @"C:\Users\Public\Documents\Letter.docx";
string strTxt = "Append text in body - OpenAndAddTextToWordDocument";
OpenAndAddTextToWordDocument(strDoc, strTxt);
A continuación se incluye el código de ejemplo completo en C# y Visual Basic.
Observe que el método OpenAndAddTextToWordDocument no incluye una llamada explícita a Save. Esto se debe a que la función de autoguardado está activada de forma predeterminada y no se deshabilitó en la llamada al método Open por medio de OpenSettings.
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
using System;
OpenAndAddTextToWordDocument(args[0], args[1]);
static void OpenAndAddTextToWordDocument(string filepath, string txt)
{
// Open a WordprocessingDocument for editing using the filepath.
WordprocessingDocument wordprocessingDocument = WordprocessingDocument.Open(filepath, true);
if (wordprocessingDocument is null)
{
throw new ArgumentNullException(nameof(wordprocessingDocument));
}
// Assign a reference to the existing document body.
MainDocumentPart mainDocumentPart = wordprocessingDocument.MainDocumentPart ?? wordprocessingDocument.AddMainDocumentPart();
mainDocumentPart.Document ??= new Document();
mainDocumentPart.Document.Body ??= mainDocumentPart.Document.AppendChild(new Body());
Body body = wordprocessingDocument.MainDocumentPart!.Document!.Body!;
// Add new text.
Paragraph para = body.AppendChild(new Paragraph());
Run run = para.AppendChild(new Run());
run.AppendChild(new Text(txt));
// Dispose the handle explicitly.
wordprocessingDocument.Dispose();
}