Compartir a través de


Agregar un nuevo elemento de documento a un paquete

En este tema se muestra cómo usar las clases del SDK de Open XML para Office para agregar un elemento de documento (archivo) a un documento de procesamiento de texto mediante programación.

Partes de documento y paquetes

Un documento Open XML se almacena como un paquete, cuyo formato está definido por ISO/IEC 29500. 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

El código comienza con la apertura de un archivo de paquete pasando un nombre de archivo a uno de los métodos sobrecargados Open de WordprocessingDocument que toma una cadena y un valor booleano que especifica si el archivo debe abrirse para su edición o para el acceso de solo lectura. En este caso, el valor booleano especifica true que el archivo debe abrirse en modo de lectura y escritura.

using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, true))

Con v3.0.0+ el Close() método se ha quitado en favor de confiar en la instrucción using. Garantiza que se llama automáticamente al Dispose() método cuando se alcanza 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 WordprocessingDocument clase del SDK de Open XML guarda y cierra automáticamente el objeto como parte de su IDisposable implementación y, dado Dispose() que se llama automáticamente al salir del bloque, no es necesario llamar Save() explícitamente o siempre que Dispose() use una using instrucción.

Estructura de un documento WordProcessingML

La estructura básica de un WordProcessingML documento consta de los document elementos y body , seguidos de uno o varios elementos de nivel de bloque, como p, que representa un párrafo. Un párrafo contiene uno o varios r elementos. significa r ejecutar, que es una región de texto con un conjunto común de propiedades, como el formato. Una ejecución contiene uno o varios t elementos. El t elemento contiene un intervalo de texto. En el ejemplo de código siguiente se muestra el WordprocessingML marcado de un documento que contiene el texto "Texto de ejemplo".

    <w:document xmlns:w="http://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 WordprocessingML elementos. Encontrará estas clases en el espacio de nombres. En la tabla siguiente se enumeran los nombres de clase de las clases correspondientes a los documentelementos , body, p, ry t .

Elemento de WordprocessingML Open XML SDK (clase) Descripción
<document/> 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

Después de abrir el documento para su edición, en la using instrucción , como un WordprocessingDocument objeto , el código crea una referencia al MainDocumentPart elemento y agrega un nuevo elemento XML personalizado. A continuación, lee el contenido del archivo externo que contiene el XML personalizado y lo escribe en el CustomXmlPart elemento.

Nota:

[!NOTA] Para usar el nuevo elemento de documento en el documento, agregue un vínculo al elemento de documento en el elemento de relación del nuevo elemento.

MainDocumentPart mainPart = wordDoc.MainDocumentPart ?? wordDoc.AddMainDocumentPart();

CustomXmlPart myXmlPart = mainPart.AddCustomXmlPart(CustomXmlPartType.CustomXml);

using (FileStream stream = new FileStream(fileName, FileMode.Open))
{
    myXmlPart.FeedData(stream);
}

Código de ejemplo

El siguiente código agrega una nueva parte de documento que contiene XML personalizado desde un archivo externo y, a continuación, rellena la parte. Para llamar al método en el AddCustomXmlPart programa, use el ejemplo siguiente que modifica un archivo agregando un nuevo elemento de documento.

string document = args[0];
string fileName = args[1];

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

Nota:

[!NOTA] Antes de ejecutar el programa, cambie la extensión de archivo de Word de .docx a .zip y vea el contenido del archivo .zip. A continuación, vuelva a cambiar la extensión a .docx y ejecute el programa. Una vez ejecutado el programa, vuelva a cambiar la extensión a .zip y vea su contenido. Verá una carpeta adicional denominada "customXML". Esta carpeta contiene el archivo XML que representa el elemento agregado.

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

static void AddNewPart(string document, string fileName)
{
    using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, true))
    {
        MainDocumentPart mainPart = wordDoc.MainDocumentPart ?? wordDoc.AddMainDocumentPart();

        CustomXmlPart myXmlPart = mainPart.AddCustomXmlPart(CustomXmlPartType.CustomXml);

        using (FileStream stream = new FileStream(fileName, FileMode.Open))
        {
            myXmlPart.FeedData(stream);
        }
    }
}

Recursos adicionales