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


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

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

См. также

Справочник по библиотеке классов пакета SDK Open XML