Получить содержимое части документа из пакета
В этом разделе показано, как использовать классы в пакете SDK Open XML для Office для получения содержимого части документа в документе Wordprocessing программным способом.
Пакеты и части документов
Документ Open XML хранится в виде пакета, формат которого определяется стандартом ISO/IEC 29500. Пакет может содержать несколько частей, между которыми существуют связи. Связь между частями определяет категорию документа. Документ может быть определен как текстовый, если его элемент связи пакета содержит связь с основной частью документа. Если элемент связи пакета содержит связь с частью презентации, документ может быть определен как документ презентации. Если элемент связи пакета содержит связь с частью книги, документ определяется как электронная таблица. В данном практическом руководстве рассматривается пакет текстового документа.
Получение объекта WordprocessingDocument
Код начинается с открытия файла пакета, передав имя файла одному из перегруженных Open методов (общий метод .NET Visual Basic или статический WordprocessingDocument метод C#), который принимает строку и логическое значение, указывающее, следует ли открывать файл в режиме чтения и записи. В этом случае логическое значение false
указывает, что файл должен быть открыт в режиме только для чтения, чтобы избежать случайных изменений.
using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, false))
В версии 3.0.0+ Close() метод был удален в пользу использования инструкции using.
Это гарантирует, что Dispose() метод автоматически вызывается при достижении закрывающей фигурной скобки. Блок, следующий за инструкцией using, создает область для объекта, создаваемого или именуемого в инструкции using.
WordprocessingDocument Так как класс в пакете SDK open XML автоматически сохраняет и закрывает объект в рамках его IDisposable реализации, а так как Dispose() вызывается автоматически при выходе из блока, не нужно явно вызывать Save() или Dispose() до тех пор, пока вы используете инструкцию using
.
Структура документа WordProcessingML
Базовая структура WordProcessingML
документа состоит из document
элементов и body
, за которыми следует один или несколько элементов уровня блока, таких как p
, который представляет абзац. Абзац содержит один или несколько r
элементов. Представляет r
собой область текста с общим набором свойств, таких как форматирование. Выполнение содержит один или несколько t
элементов. Элемент t
содержит диапазон текста. В следующем примере кода показана разметка WordprocessingML
для документа, содержащего текст "Пример текста".
<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>
С помощью пакета SDK Open XML можно создавать структуру документа и содержимое с помощью строго типизированных классов, соответствующих WordprocessingML
элементам. Эти классы находятся в пространстве имен. В следующей таблице перечислены имена классов, которые соответствуют document
элементам , body
, p
, r
и t
.
Элемент WordprocessingML | Класс пакета SDK Open XML | Описание |
---|---|---|
<document/> |
Document | Корневой элемент основной части документа. |
<body/> |
Body | Контейнер для структур уровня блокировки, таких как абзацы, таблицы, примечания и других элементов, описанных в спецификации ISO/IEC 29500. |
<p/> |
Paragraph | Абзац. |
<r/> |
Run | Прогон. |
<t/> |
Text | Диапазон текста. |
Дополнительные сведения об общей структуре частей и элементов документа WordprocessingML см. в разделе Структура документа WordprocessingML.
Элемент Comments
В этом практическом руководстве рассматривается работа с комментариями. Поэтому полезно ознакомиться со структурой <comments/>
элемента. Приведенные ниже сведения из спецификации ISO/IEC 29500 могут быть полезны при работе с этим элементом.
Этот элемент определяет все комментарии, определенные в текущем документе. Это корневой элемент части примечаний документа WordprocessingML. Рассмотрим следующий фрагмент WordprocessingML для содержимого части комментариев в документе WordprocessingML:
<w:comments>
<w:comment … >
…
</w:comment>
</w:comments>
Элемент comments содержит один комментарий, определенный этим документом в рамках данного примера.
© ISO/IEC 29500: 2016
Содержимое этого элемента определено в следующем фрагменте схемы XML
<complexType name="CT_Comments">
<sequence>
<element name="comment" type="CT_Comment" minOccurs="0" maxOccurs="unbounded"/>
</sequence>
</complexType>
Механизм работы примера кода
После открытия исходного файла для чтения создается mainPart
объект , создав MainDocumentPart
экземпляр . Затем можно создать ссылку на WordprocessingCommentsPart
часть документа.
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>();
Затем можно использовать объект для StreamReader
чтения содержимого WordprocessingCommentsPart
части документа и возврата ее содержимого.
using (StreamReader streamReader = new StreamReader(WordprocessingCommentsPart.GetStream()))
{
comments = streamReader.ReadToEnd();
}
}
return comments;
Пример кода
Следующий код извлекает содержимое части, WordprocessingCommentsPart
содержащейся в пакете WordProcessing
документа. Программу можно запустить, вызвав метод , GetCommentsFromDocument
как показано в следующем примере.
string document = args[0];
GetCommentsFromDocument(document);
Ниже приведен полный пример кода на языках C# и 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;
}