Obtener el contenido de un elemento de documento de un paquete
En este tema se muestra cómo usar las clases del SDK de Open XML para Office para recuperar el contenido de un elemento de documento en un documento Wordprocessing 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 (método .NET Shared de Visual Basic o método estático de C#) de la WordprocessingDocument clase que toma una cadena y un valor booleano que especifica si el archivo debe abrirse en modo de lectura y escritura o no. En este caso, el valor booleano especifica false
que el archivo debe abrirse en modo de solo lectura para evitar cambios accidentales.
using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, false))
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 document
elementos , body
, p
, r
y 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.
Elemento Comments
En este procedimiento, se va a trabajar con comentarios. Por lo tanto, es útil familiarizarse con la estructura del <comments/>
elemento. La siguiente información de la especificación ISO/IEC 29500 puede ser útil cuando se trabaja con este elemento.
Este elemento especifica todos los comentarios definidos en el documento actual. Es el elemento raíz de la parte de comentarios de un documento WordprocessingML. Tenga en cuenta el siguiente fragmento de WordprocessingML para el contenido de una parte de comentarios en un documento WordprocessingML:
<w:comments>
<w:comment … >
…
</w:comment>
</w:comments>
El elemento comments contiene el único comentario especificado por este documento en este ejemplo.
© ISO/IEC 29500: 2016
El siguiente fragmento de esquema XML define el contenido de este elemento.
<complexType name="CT_Comments">
<sequence>
<element name="comment" type="CT_Comment" minOccurs="0" maxOccurs="unbounded"/>
</sequence>
</complexType>
Funcionamiento del código de ejemplo
Después de abrir el archivo de origen para su lectura, cree un mainPart
objeto creando una instancia de MainDocumentPart
. A continuación, puede crear una referencia a la WordprocessingCommentsPart
parte del documento.
static string GetCommentsFromDocument(string document)
{
string? comments = null;
using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, false))
{
if (wordDoc is null)
{
throw new ArgumentNullException(nameof(wordDoc));
}
MainDocumentPart mainPart = wordDoc.MainDocumentPart ?? wordDoc.AddMainDocumentPart();
WordprocessingCommentsPart WordprocessingCommentsPart = mainPart.WordprocessingCommentsPart ?? mainPart.AddNewPart<WordprocessingCommentsPart>();
A continuación, puede usar un StreamReader
objeto para leer el contenido de la WordprocessingCommentsPart
parte del documento y devolver su contenido.
using (StreamReader streamReader = new StreamReader(WordprocessingCommentsPart.GetStream()))
{
comments = streamReader.ReadToEnd();
}
}
return comments;
Código de ejemplo
El código siguiente recupera el contenido de un WordprocessingCommentsPart
elemento contenido en un WordProcessing
paquete de documentos. Puede ejecutar el programa llamando al GetCommentsFromDocument
método como se muestra en el ejemplo siguiente.
string document = args[0];
GetCommentsFromDocument(document);
A continuación se muestra el ejemplo de código completo en C# y Visual Basic.
static string GetCommentsFromDocument(string document)
{
string? comments = null;
using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, false))
{
if (wordDoc is null)
{
throw new ArgumentNullException(nameof(wordDoc));
}
MainDocumentPart mainPart = wordDoc.MainDocumentPart ?? wordDoc.AddMainDocumentPart();
WordprocessingCommentsPart WordprocessingCommentsPart = mainPart.WordprocessingCommentsPart ?? mainPart.AddNewPart<WordprocessingCommentsPart>();
using (StreamReader streamReader = new StreamReader(WordprocessingCommentsPart.GetStream()))
{
comments = streamReader.ReadToEnd();
}
}
return comments;
}