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


Создание пакета

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

Пакеты и части документов

Документ Open XML хранится в виде пакета, формат которого определяется стандартом ISO/IEC 29500. Пакет может содержать несколько частей, между которыми существуют связи. Связь между частями определяет категорию документа. Документ может быть определен как текстовый, если его элемент связи пакета содержит связь с основной частью документа. Если элемент связи пакета содержит связь с частью презентации, документ может быть определен как документ презентации. Если элемент связи пакета содержит связь с частью книги, документ определяется как электронная таблица. В данном практическом руководстве рассматривается пакет текстового документа.

Получение объекта WordprocessingDocument

В пакете SDK WordprocessingDocument Open XML класс представляет пакет документов Word. Чтобы создать документ Word, создайте экземпляр WordprocessingDocument класса и заполните его частями. Документ должен содержать как минимум основную часть документа, которая служит контейнером для текста документа. Текст представлен в пакете в виде XML с помощью WordprocessingML разметки.

Создание экземпляра класса, вызываемого Create(String, WordprocessingDocumentType). Предоставляется несколько Create методов, каждый из которых имеет разную сигнатуру. В первый параметр передается строка с полным путем, которая представляет создаваемый документ. Второй параметр является членом перечисления WordprocessingDocumentType . Этот параметр представляет тип документа. Например, существует отдельный член перечисления WordprocessingDocumentType для каждого документа, шаблона и макроса с поддержкой различных документов и шаблонов.

Примечание.

Тщательно выберите соответствующий WordprocessingDocumentType файл и убедитесь, что сохраненный файл имеет правильное, соответствующее расширение файла. WordprocessingDocumentType Если файл не соответствует расширению файла, при открытии файла в Microsoft Word возникает ошибка.

using (WordprocessingDocument wordDoc = WordprocessingDocument.Create(document, WordprocessingDocumentType.Document))

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

После создания пакета документов Word в него можно добавлять части. Чтобы добавить main часть документа, вызовите AddMainDocumentPart. После этого можно добавить структуру документа и текст.

Структура документа 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.

Пример кода

Ниже приведен полный пример кода, который можно использовать для создания пакета текстовых документов Open XML из XML-содержимого в виде разметки WordprocessingML .

После запуска программы откройте созданный файл и проверьте его содержимое; это должен быть один абзац, содержащий фразу "Hello мире!"

Ниже приведен полный пример кода на языках C# и Visual Basic.

// To create a new package as a Word document.
static void CreateNewWordDocument(string document)
{
    using (WordprocessingDocument wordDoc = WordprocessingDocument.Create(document, WordprocessingDocumentType.Document))
    {
        // Set the content of the document so that Word can open it.
        MainDocumentPart mainPart = wordDoc.AddMainDocumentPart();

        SetMainDocumentContent(mainPart);
    }
}

// Set the content of MainDocumentPart.
static void SetMainDocumentContent(MainDocumentPart part)
{
    const string docXml = @"<?xml version=""1.0"" encoding=""utf-8""?>
                            <w:document xmlns:w=""http://schemas.openxmlformats.org/wordprocessingml/2006/main"">
                              <w:body>
                                <w:p>
                                  <w:r>
                                    <w:t>Hello World</w:t>
                                  </w:r>
                                </w:p>
                              </w:body>
                            </w:document>";

    using (Stream stream = part.GetStream())
    {
        byte[] buf = (new UTF8Encoding()).GetBytes(docXml);
        stream.Write(buf, 0, buf.Length);
    }
}

См. также