Скопируйте содержимое части пакета Open XML в часть документа другого пакета
В этом разделе показано, как использовать классы в Open XML SDK 2.5 для Office для копирования содержимого части текстового документа Open XML в часть текстового документа программными средствами.
Для компиляции кода, представленного в этом разделе, требуются следующие директивы сборки.
Пакеты и части документа
Документ Open XML хранится в виде пакета, формат которого определяется спецификацией ISO/IEC 29500-2. Пакет может состоять из нескольких частей со связями между ними. Связь между частями определяет категорию документа. Документ может быть определен как текстовый документ, если его элемент связи пакета содержит связь с основной частью документа. Если соответствующий элемент содержит связь с частью презентации, он может быть определен как презентация. Если соответствующий элемент содержит связь с частью книги, он определяется как электронная таблица. В этот разделе вы будете использовать пакет текстового документа.
Получение объекта WordprocessingDocument
Чтобы открыть существующий документ, создайте экземпляр класса WordprocessingDocument, как показано в приведенных ниже двух операторах using. В том же операторе откройте текстовый файл с указанным именем файла с помощью метода Open вместе с параметром типа Boolean. Для исходного файла установите значение параметра false, чтобы открыть его для доступа только для чтения. Для целевого файла установите значение параметра true, чтобы разрешить редактирование документа.
Инструкцию using рекомендуется использовать вместо традиционной последовательности .Create, .Save, .Close. Это позволяет обеспечить автоматический вызов метода Dispose (внутреннего метода, используемого пакетом SDK Open XML для очистки ресурсов) при достижении закрывающей скобки. Блок, следующий за инструкцией using, создает область для объекта, создаваемого или именуемого в инструкции using. Так как класс WordprocessingDocument в пакете SDK Open XML автоматически сохраняет и закрывает объект как часть реализации System.IDisposable, а также поскольку метод Dispose вызывается автоматически при выходе из блока, не нужно явно вызывать методы Save и Close, если используется инструкция using.
Структура документа WordProcessingML
Базовая структура документа WordProcessingML состоит из элементов document и body, а также из одного или нескольких элементов уровня блока, таких как p, который представляет абзац. В свою очередь, абзац содержит один или несколько элементов r. r представляет прогон областью текста с общим набором свойств, например форматированием. Прогон содержит один или несколько элементов t. t содержит фрагмент текста. В следующем примере кода показаны исправления WordprocessingML для документа с текстом "Example text."
С помощью пакета SDK 2.5 Open XML можно создать структуру и содержимое документа, использующие строго типизированные классы, которые соответствуют элементам WordprocessingML. Эти классы можно найти в пространстве имен DocumentFormat.OpenXml.Wordprocessing . В следующей таблице перечислены имена классов, соответствующие элементам document, body, p, r и t.
Элемент WordprocessingML Класс пакета Open XML SDK 2.5 Описание document Document Корневой элемент основной части документа. body Body Контейнер для структур уровня блокировки, таких как абзацы, таблицы, примечания и других элементов, описанных в спецификации ISO/IEC 29500. p Paragraph Абзац. r Run Прогон. t Text Диапазон текста.
Часть темы
Часть темы содержит сведения о цвете, шрифте и формате документа. Она определена в спецификации ISO/IEC 29500 следующим образом.
Экземпляр части этого типа содержит информацию о теме документа, которая включает в себя цветовую схему, схему шрифтов и схему форматов (последнюю также называют эффектами). Для документа WordprocessingML выбор темы помимо прочего влияет на цвет и стиль заголовков. Для документа SpreadsheetML выбор темы помимо прочего влияет на цвет и стиль содержимого ячеек и диаграмм. При выборе темы для документа PresentationML наряду с прочими элементами изменяются форматирование слайдов, раздаточные материалы и заметки через связанный с ними образец.
Пакет WordprocessingML или SpreadsheetML должен содержать не более одной части "тема", которая должна быть конечным объектом неявной связи в части "основной документ" (§11.3.10) или "книга" (§12.3.23). Пакет PresentationML не должен содержать ни одной части "тема" или содержать одну такую часть для каждой части "образец выдач" (§13.3.3), "образец заметок" (§13.3.4), "образец слайда" (§13.3.10) или "презентация" (§13.3.6) посредством неявной связи.
Пример: Следующий элемент связи части основного документа WordprocessingML содержит связь с частью темы, которая хранится в ZIP элемента theme/theme1.xml:
Как работает пример кода
Для копирования содержимого части документа в пакете Open XML в часть документа в другом пакете, методу CopyThemeContent в качестве параметров передаются полные пути каждого документа Word. Затем в коде оба документа открываются в виде объектов WordprocessingDocument и создаются переменные, ссылающиеся на части ThemePart каждого из пакетов.
Далее в коде считывается содержимое исходной части ThemePart с помощью объекта StreamReader и выполняется запись в конечную часть ThemePart с помощью объекта StreamWriter.
Пример кода
Следующий код копирует содержимое одной части документа пакета Open XML в часть документа другого пакета. Чтобы вызвать метод CopyThemeContent, можно использовать следующий пример, который копирует часть темы из «MyPkg4.docx» «MyPkg3.docx.»
Перед запуском программы убедитесь в том, что в исходном документе (MyPkg4.docx) установлена часть темы, в противном случае будет создано исключение. Для добавления темы в документ, откройте его в Microsoft Word 2013, перейдите на вкладку Page Layout, нажмите Themes и выберите одну из доступных тем.
После запуска программы можно проверить файл «MyPkg3.docx», чтобы увидеть скопированную тему из файла «MyPkg4.docx.»