Получить комментарии из документа обработки текста
В этом разделе описывается использование классов в пакете 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);
}
}
}
}