Share via


Crear un paquete

En este tema se muestra cómo usar las clases del SDK de Open XML para Office para crear mediante programación un paquete de documentos de procesamiento de texto a partir de contenido en forma de marcado XML WordprocessingML .

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

En Open XML SDK, la clase WordprocessingDocument representa un paquete de documentos de Word. Para crear un documento de Word, debe crear una instancia de la clase WordprocessingDocument y rellenarla con partes. Como mínimo, el documento debe tener una parte de documento principal que sirva como contenedor del texto principal del documento. En el paquete, el texto se representa como XML mediante el marcado WordprocessingML.

Para crear la instancia de clase, llame al método Create(String, WordprocessingDocumentType) . Se proporcionan varios métodos Create, cada uno con una firma distinta. El código de ejemplo de este tema usa el método Create con una firma que requiere dos parámetros. El primer parámetro lleva una cadena de ruta de acceso completa que representa el documento que desea crear. El segundo parámetro es un miembro de la enumeración WordprocessingDocumentType. Este parámetro representa el tipo de documento. Por ejemplo, hay un miembro diferente de la enumeración WordProcessingDocumentType para cada documento, plantilla y la variedad de documento y plantilla con macros habilitadas.

Nota:

[!NOTA] Seleccione cuidadosamente el WordProcessingDocumentType correcto y compruebe que el archivo almacenado tenga la extensión de archivo coincidente correcta. Si WordProcessingDocumentType no coincide con la extensión de archivo, se producirá un error al abrir el archivo en Microsoft Word. El código que llama al método Create forma parte de una instrucción using seguida de un bloque entre corchetes, como se muestra en el siguiente ejemplo de código.

    using (WordprocessingDocument wordDoc = WordprocessingDocument.Create(document, WordprocessingDocumentType.Document))
    {
       // Insert other code here. 
    }

La instrucción using proporciona una alternativa recomendada a la típica secuencia .Create, .Save, .Close. Garantiza que se llamará automáticamente al método Dispose (un método interno que Open XML SDK usa para limpiar recursos) cuando se llegue al corchete 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, en este caso wordDoc. 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 entre corchetes, no necesita llamar explícitamente a Save y Close, siempre que use using.

Una vez que haya creado el paquete de documentos de Word, puede agregarle partes. Para agregar la parte de documento principal, debe llamar al método AddMainDocumentPart() de la clase WordprocessingDocument. Una vez hecho esto, puede comenzar a agregar el texto y la estructura del documento.

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.

Código de ejemplo

A continuación se proporciona el código de ejemplo completo que puede usar para crear un paquete de documentos de procesamiento de texto de Office Open XML a partir de contenido XML en forma de marcado WordprocessingML. En el programa, puede invocar el método CreateNewWordDocument mediante la siguiente llamada:

    CreateNewWordDocument(@"C:\Users\Public\Documents\MyPkg4.docx");

Una vez ejecutado el programa, abra el archivo "myPkg4.docx" creado y examine su contenido. Debería ser un párrafo con la frase "Hello world!".

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


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

CreateNewWordDocument(args[0]);

// To create a new package as a Word document.
static void CreateNewWordDocument(string document)
{
    using (WordprocessingDocument wordDoc = WordprocessingDocument.Create(document, WordprocessingDocumentType.Document))
    {
        // Set the content of the document so that Word can open it.
        MainDocumentPart mainPart = wordDoc.AddMainDocumentPart();

        SetMainDocumentContent(mainPart);
    }
}

// Set the content of MainDocumentPart.
static void SetMainDocumentContent(MainDocumentPart part)
{
    const string docXml = @"<?xml version=""1.0"" encoding=""utf-8""?>
                            <w:document xmlns:w=""http://schemas.openxmlformats.org/wordprocessingml/2006/main"">
                              <w:body>
                                <w:p>
                                  <w:r>
                                    <w:t>Hello World</w:t>
                                  </w:r>
                                </w:p>
                              </w:body>
                            </w:document>";

    using (Stream stream = part.GetStream())
    {
        byte[] buf = (new UTF8Encoding()).GetBytes(docXml);
        stream.Write(buf, 0, buf.Length);
    }
}