Compartir a través de


Recuperar comentarios de un documento de procesamiento de texto

En este tema se describe cómo usar las clases del SDK de Open XML para Office para recuperar mediante programación los comentarios de la parte principal del documento en un documento de procesamiento de texto.


Apertura del documento existente para acceso de solo lectura

Para abrir un documento existente, cree una instancia de la WordprocessingDocument clase como se muestra en la instrucción siguiente using . En la misma instrucción, abra el archivo de procesamiento de texto en el especificado fileName mediante el Open(String, Boolean, OpenSettings) método . Para abrir el archivo para editar el parámetro booleano se establece en true. En este ejemplo, solo tiene que leer el archivo; por lo tanto, puede abrir el archivo para el acceso de solo lectura estableciendo el parámetro booleano en false.

using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(fileName, false))
{
    if (wordDoc.MainDocumentPart is null || wordDoc.MainDocumentPart.WordprocessingCommentsPart is null)
    {
        throw new System.ArgumentNullException("MainDocumentPart and/or WordprocessingCommentsPart is null.");
    }

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.


Elemento Comments

Los comments elementos y comment son fundamentales para trabajar con comentarios en un archivo de procesamiento de texto. En este ejemplo de código, es importante familiarizarse con esos elementos.

La siguiente información de la especificación ISO/IEC 29500 presenta el elemento de comentarios.

comments (colección de comentarios)

Este elemento especifica todos los comentarios definidos en el documento actual. Se trata del elemento raíz del elemento de comentarios de un documento WordprocessingML.

Considere el siguiente fragmento de WordprocessingML para el contenido de una parte de comentarios de un documento WordprocessingML:

    <w:comments>
      <w:comment … >
        …
      </w:comment>
    </w:comments>

© ISO/IEC 29500: 2016

El siguiente segmento de esquema XML define el contenido del elemento de comentarios.

    <complexType name="CT_Comments">
       <sequence>
           <element name="comment" type="CT_Comment" minOccurs="0" maxOccurs="unbounded"/>
       </sequence>
    </complexType>

Elemento Comment

La siguiente información de la especificación ISO/IEC 29500 presenta el elemento de comentario.

comment (contenido del comentario)

Este elemento especifica el contenido de un único comentario almacenado en la parte de comentarios de un documento WordprocessingML.

Si el contenido del documento no hace referencia a un comentario mediante un un atributo id coincidente en un uso válido del elemento commentReference, es posible que se ignore dicho comentario al cargar el documento. Si varios comentarios comparten el mismo valor para el atributo id, se puede cargar un único comentario y el resto pueden omitirse.

Considere un documento con texto con un comentario anotado, como se muestra a continuación:

Texto de documento con comentario anotado

Este comentario está representado por el siguiente fragmento de WordprocessingML.

    <w:comment w:id="1" w:initials="User">
      …
    </w:comment>

El elemento comment especifica la presencia de un único comentario en la parte de comentarios.

© ISO/IEC 29500: 2016

El siguiente segmento de esquema XML define el contenido del elemento de comentario.

    <complexType name="CT_Comment">
       <complexContent>
           <extension base="CT_TrackChange">
              <sequence>
                  <group ref="EG_BlockLevelElts" minOccurs="0" maxOccurs="unbounded"/>
              </sequence>
              <attribute name="initials" type="ST_String" use="optional"/>
           </extension>
       </complexContent>
    </complexType>

Funcionamiento del código de ejemplo

Después de abrir el archivo para el acceso de solo lectura, cree una instancia de la WordprocessingCommentsPart clase . A continuación, puede mostrar el texto interno del Comment elemento.

WordprocessingCommentsPart commentsPart = wordDoc.MainDocumentPart.WordprocessingCommentsPart;

if (commentsPart is not null && commentsPart.Comments is not null)
{
    foreach (Comment comment in commentsPart.Comments.Elements<Comment>())
    {
        Console.WriteLine(comment.InnerText);
    }
}

Código de ejemplo

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;

static void GetCommentsFromDocument(string fileName)
{
    using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(fileName, false))
    {
        if (wordDoc.MainDocumentPart is null || wordDoc.MainDocumentPart.WordprocessingCommentsPart is null)
        {
            throw new System.ArgumentNullException("MainDocumentPart and/or WordprocessingCommentsPart is null.");
        }

        WordprocessingCommentsPart commentsPart = wordDoc.MainDocumentPart.WordprocessingCommentsPart;

        if (commentsPart is not null && commentsPart.Comments is not null)
        {
            foreach (Comment comment in commentsPart.Comments.Elements<Comment>())
            {
                Console.WriteLine(comment.InnerText);
            }
        }
    }
}

Recursos adicionales