Share via


Copia del contenido de un elemento de paquete Open XML en un elemento de documento en un paquete diferente

En este tema se muestra cómo usar las clases del SDK de Open XML para Office para copiar el contenido de un elemento de documento Wordprocessing de Open XML en un elemento de documento en un documento de procesamiento de texto diferente mediante programación.


Partes de documento y paquetes

Un documento Office Open XML se almacena como un paquete, cuyo formato se define mediante ISO/IEC 29500-2. El paquete puede incluir varias partes con relaciones entre ellas. La relación entre las partes controla la categoría del documento. Un documento puede definirse como un documento de procesamiento de texto si su elemento de relación de paquete contiene una relación con una parte de documento principal. Si su elemento de relación de paquete contiene una relación con una parte de presentación, puede definirse como un documento de presentación. Si su elemento de relación de paquete contiene una relación con una parte de libro, se define como un documento de hoja de cálculo. En este tema sobre procedimientos se usará un paquete de documentos de procesamiento de texto.


Obtención de un objeto WordprocessingDocument

Para abrir un documento existente, cree una instancia de la clase WordprocessingDocument , como se muestra en las dos instrucciones using siguientes. En la misma instrucción, se abre el archivo de procesamiento de texto con el nombre de archivo especificado mediante el método Open , con el parámetro Boolean. Para el archivo de origen, establezca el parámetro en false para abrirlo con acceso de solo lectura. Para el archivo de destino, establezca el parámetro en true con el fin de habilitar la edición del documento.

    using (WordprocessingDocument wordDoc1 = WordprocessingDocument.Open(fromDocument1, false))
    using (WordprocessingDocument wordDoc2 = WordprocessingDocument.Open(toDocument2, true))
    {
        // Insert other code here.
    }

La instrucción using proporciona una alternativa recomendada a la típica secuencia .Create, .Save, .Close. Garantiza que se llame automáticamente al método Dispose (un método interno que Open XML SDK usa para limpiar recursos) cuando se llegue a la llave de cierre. El bloque que sigue a la instrucción using establece un ámbito para el objeto que se crea o se nombra en la instrucción using. Dado que la clase WordprocessingDocument en Open XML SDK guarda y cierra el objeto automáticamente como parte de su implementación System.IDisposable y que se llama automáticamente a Dispose cuando sale del bloque, no necesita llamar explícitamente a Save y Close, siempre que use using.


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.


La parte de tema

La parte de tema contiene información sobre el color, fuente y formato de un documento. Se define en la siguiente especificación ISO/IEC 29500.

Una instancia de este tipo de parte contiene información acerca del tema de un documento, que es una mezcla de combinación de colores, combinación de fuentes y combinación de formatos (también se hace referencia a esta última como efectos). En un documento WordprocessingML, la elección del tema afecta al color y estilo de los encabezados, entre otras cosas. En un documento SpreadsheetML, la elección del tema afecta al color y estilo del contenido y los gráficos de las celdas, entre otras cosas. En un documento PresentationML, la elección del tema afecta al formato de las diapositivas, los documentos y las notas mediante el patrón asociado, entre otras cosas.

Los paquetes WordprocessingML o SpreadsheetML pueden contener una o ninguna parte de tema, que debe ser el destino de una relación implícita en una parte de documento principal (§11.3.10) o de libro (§12.3.23). Los paquetes PresentationML pueden contener una o ninguna parte de tema por parte de patrón de documentos (§13.3.3), de patrón de notas (§13.3.4), de patrón de diapositivas (§13.3.10) o de presentación (§13.3.6) mediante una relación implícita.

Ejemplo: El siguiente elemento de relación de elementos de documento principal WordprocessingML contiene una relación con el elemento Theme, que se almacena en el tema o theme1.xml del elemento ZIP:

    <Relationships xmlns="…">
       <Relationship Id="rId4"
          Type="https://…/theme" Target="theme/theme1.xml"/>
    </Relationships>

© ISO/IEC29500: 2008.


Funcionamiento del código de ejemplo

Para copiar el contenido de una parte de documento de un paquete de Office Open XML en una parte de documento de un paquete diferente, se pasa la ruta de acceso completa de cada documento de procesamiento de texto como un parámetro al método CopyThemeContent. El código, a continuación, abre los dos documentos como objetos WordprocessingDocument y crea variables que hacen referencia a las partes ThemePart de cada uno de los paquetes.

    public static void CopyThemeContent(string fromDocument1, string toDocument2)
    {
       using (WordprocessingDocument wordDoc1 = WordprocessingDocument.Open(fromDocument1, false))
       using (WordprocessingDocument wordDoc2 = WordprocessingDocument.Open(toDocument2, true))
       {
          ThemePart themePart1 = wordDoc1.MainDocumentPart.ThemePart;
          ThemePart themePart2 = wordDoc2.MainDocumentPart.ThemePart;

A continuación, el código lee el contenido de la parte ThemePart de origen mediante un objeto StreamReader y escribe en la parte ThemePart de destino mediante un objeto StreamWriter.

    using (StreamReader streamReader = new StreamReader(themePart1.GetStream()))
    using (StreamWriter streamWriter = new StreamWriter(themePart2.GetStream(FileMode.Create))) 
    {
        streamWriter.Write( streamReader.ReadToEnd());
    }

Código de ejemplo

El siguiente código, copia el contenido de una parte de documento de un paquete de Office Open XML a una parte de documento de otro paquete. Para llamar al método CopyThemeContent, puede usar el siguiente ejemplo, que copia la parte de tema de "MyPkg4.docx" a "MyPkg3.docx".

    string fromDocument1 = @"C:\Users\Public\Documents\MyPkg4.docx";
    string toDocument2 = @"C:\Users\Public\Documents\MyPkg3.docx";
    CopyThemeContent(fromDocument1, toDocument2);

Importante

Antes de ejecutar el programa, asegúrese de que el documento de origen (MyPkg4.docx) tiene el elemento de tema establecido; de lo contrario, se produciría una excepción. Para agregar un tema a un documento, ábralo en Microsoft Word 2013, haga clic en la pestaña Diseño de página, haga clic en Temas y seleccione uno de los temas disponibles.

Después de ejecutar el programa, puede inspeccionar el archivo "MyPkg3.docx" para ver el tema copiado desde el archivo "MyPkg4.docx".

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


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

CopyThemeContent(args[0], args[1]);

// To copy contents of one package part.
static void CopyThemeContent(string fromDocument1, string toDocument2)
{
    using (WordprocessingDocument wordDoc1 = WordprocessingDocument.Open(fromDocument1, false))
    using (WordprocessingDocument wordDoc2 = WordprocessingDocument.Open(toDocument2, true))
    {
        ThemePart? themePart1 = wordDoc1?.MainDocumentPart?.ThemePart;
        ThemePart? themePart2 = wordDoc2?.MainDocumentPart?.ThemePart;

        // If the theme parts are null, then there is nothing to copy.
        if (themePart1 is null || themePart2 is null)
        {
            return;
        }

        using (StreamReader streamReader = new StreamReader(themePart1.GetStream()))
        using (StreamWriter streamWriter = new StreamWriter(themePart2.GetStream(FileMode.Create)))
        {
            streamWriter.Write(streamReader.ReadToEnd());
        }
    }
}

Vea también