Share via


Abrir un documento de procesamiento de texto desde una secuencia

En este tema se muestra cómo usar las clases del SDK de Open XML para Office para abrir mediante programación un documento de procesamiento de Word desde una secuencia.

Cuándo se debe abrir un documento de una secuencia

Si tiene una aplicación, como una aplicación de SharePoint, que funciona con documentos que usan entrada y salida de flujo y desea emplear el SDK de Open XML para trabajar con uno de los documentos, esto está diseñado para ser fácil de hacer. Esto es especialmente cierto si el documento existe y puede abrirlo mediante el SDK de Open XML. Sin embargo, imagine que el documento contiene un flujo abierto en el lugar del código donde necesita trabajar con el SDK. Ese es el escenario de este tema. El método de ejemplo del código de ejemplo acepta una secuencia abierta como parámetro y, a continuación, agrega texto al documento detrás de la secuencia mediante el 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 trabajar con un documento de Word, primero debe crear una instancia de la clase WordprocessingDocument desde el documento y, a continuación, trabajar con esa instancia. Cuando se crea la instancia desde el documento, se puede obtener acceso a la parte de documento principal que contiene el texto del documento. Cada paquete de Office Open XML contiene una cierta cantidad de partes. Como mínimo, un WordProcessingDocument debe contener una parte de documento principal que cumpla la función de contenedor para el texto principal del documento. El paquete también puede tener partes adicionales. Tenga en cuenta que en un documento de Word, el texto de la parte de documento principal se representa en el paquete como XML mediante el marcado WordprocessingML.

Para crear la instancia de clase desde el documento, llame al método Open(Stream, Boolean) . Se proporcionan varios métodos Open, cada uno con una firma distinta. El código de ejemplo de este tema usa el método Open con una firma que requiere dos parámetros. El primer parámetro toma un identificador de la secuencia desde la que desea abrir el documento. El segundo es true o false y representa si la secuencia se abre para edición o no.

El siguiente ejemplo de código llama al método Open.

    // Open a WordProcessingDocument based on a stream.
    WordprocessingDocument wordprocessingDocument = 
        WordprocessingDocument.Open(stream, true);

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.

Funcionamiento del código de ejemplo

Cuando abre el paquete de documentos de Word, puede agregar texto a la parte de documento principal. Para obtener acceso al cuerpo de la parte de documento principal, asigne una referencia al cuerpo del documento existente, como se muestra en el siguiente segmento de código.

    // Assign a reference to the existing document body.
    Body body = wordprocessingDocument.MainDocumentPart.Document.Body;

Cuando obtenga acceso al cuerpo de la parte de documento principal, agregue texto mediante la adición de instancias de las clases Paragraph, Run y Text. Esto genera el marcado WordprocessingML necesario. Con las siguientes líneas del ejemplo de código se agregan 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 OpenAndAddToWordprocessingStream que se muestra aquí se puede usar para abrir un documento de Word desde una secuencia que ya está abierta y anexar texto mediante Open XML SDK. Para llamarlo, puede pasar un identificador a una secuencia abierta como el primer parámetro y el texto que se va a agregar como el segundo, para llamar al método. Por ejemplo, el siguiente ejemplo de código abre el archivo Word13.docx de la carpeta Documentos públicos y le agrega texto.

    string strDoc = @"C:\Users\Public\Public Documents\Word13.docx";
    string txt = "Append text in body - OpenAndAddToWordprocessingStream";
    Stream stream = File.Open(strDoc, FileMode.Open);
    OpenAndAddToWordprocessingStream(stream, txt);
    stream.Close();

Nota:

[!NOTA] Tenga en cuenta que el método OpenAddAddToWordprocessingStream no cierra la secuencia que se pasó. De eso se ocupa el código de llamada.

A continuación se incluye el código de ejemplo completo en C# y Visual Basic.


using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
using System.IO;


static void OpenAndAddToWordprocessingStream(Stream stream, string txt)
{
    // Open a WordProcessingDocument based on a stream.
    WordprocessingDocument wordprocessingDocument = WordprocessingDocument.Open(stream, true);

    // Assign a reference to the existing document body.
    MainDocumentPart mainDocumentPart = wordprocessingDocument.MainDocumentPart ?? wordprocessingDocument.AddMainDocumentPart();
    mainDocumentPart.Document ??= new Document();
    Body body = mainDocumentPart.Document.Body ?? mainDocumentPart.Document.AppendChild(new Body());

    // Add new text.
    Paragraph para = body.AppendChild(new Paragraph());
    Run run = para.AppendChild(new Run());
    run.AppendChild(new Text(txt));

    // Dispose the document handle.
    wordprocessingDocument.Dispose();

    // Caller must close the stream.
}