Поделиться через


Получить комментарии из документа обработки текста

В этом разделе описывается использование классов в пакете SDK Open XML для Office для программного извлечения комментариев из части документа main в текстовом документе.


Открытие существующего документа только для чтения

Чтобы открыть существующий документ, создайте WordprocessingDocument экземпляр класса, как показано в следующей using инструкции. В той же инструкции откройте текстовый файл в указанном fileName с помощью Open(String, Boolean, OpenSettings) метода . Чтобы открыть файл для редактирования логического параметра, задается значение true. В этом примере нужно просто прочитать файл; Таким образом, можно открыть файл для доступа только для чтения, задав для логического параметра значение 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.");
    }

В версии 3.0.0+ Close() метод был удален в пользу использования инструкции using. Это гарантирует, что Dispose() метод автоматически вызывается при достижении закрывающей фигурной скобки. Блок, следующий за инструкцией using, создает область для объекта, создаваемого или именуемого в инструкции using. WordprocessingDocument Так как класс в пакете SDK open XML автоматически сохраняет и закрывает объект в рамках его IDisposable реализации, а так как Dispose() вызывается автоматически при выходе из блока, не нужно явно вызывать Save() или Dispose() до тех пор, пока вы используете инструкцию using .


Элемент Comments

Элементы comments и comment имеют решающее значение для работы с комментариями в текстовом файле. Этот пример кода позволяет ознакомиться с данными элементами.

В спецификации ISO/IEC 29500 содержатся следующие сведения об элементе comments.

comments (коллекция примечаний)

Этот элемент определяет все комментарии, определенные в текущем документе. Это корневой элемент части комментариев документа WordprocessingML.

Рассмотрим приведенный ниже фрагмент разметки WordprocessingML для содержимого части примечаний в документе WordprocessingML.

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

© ISO/IEC 29500: 2016

В приведенном ниже сегменте схемы XML определяется содержимое элемента comments.

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

Элемент Comment

В спецификации ISO/IEC 29500 содержатся следующие сведения об элементе comment.

comment (содержимое примечания)

В этом элементе указывается содержимое отдельного примечания, хранящегося в части примечаний документа WordprocessingML.

Если в содержимом документа отсутствует ссылка на примечание с использованием атрибута id элемента commentReference, то при загрузке документа такое примечание можно пропустить. Если одно и то же значение атрибута id соответствует нескольким примечаниям, следует загрузить только одно из них, а остальные пропустить.

Рассмотрим документ с примечанием к тексту.

Текст документа с заметкой

Это примечание представлено в указанном ниже фрагменте разметки WordprocessingML.

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

Элемент comment указывает на наличие в части примечаний одного примечания.

© ISO/IEC 29500: 2016

В приведенном ниже сегменте схемы XML определяется содержимое элемента comment.

    <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>

Механизм работы примера кода

После открытия файла для доступа только для чтения создается экземпляр WordprocessingCommentsPart класса . Затем можно отобразить внутренний Comment текст элемента.

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# и 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);
            }
        }
    }
}

См. также