Что такое word automation
- как работать с объектом Excel, внедренном в документ Word
- как работать с документом Word, внедренным в Excel.
План статьи:
Прежде, чем начать изложение основного материала, следует упомянуть некоторые моменты работы с Word, т.к. в блоге я их не касался, но эти основы пригодятся для освоения основного материала статьи.
1. Азы работы с MS Word в Delphi
Запуск MS Word в принципе ни чем не отличается от запуска MS Excel за одним небольшим исключением — меняется параметр функции CreateOLEObject:
Но, чтобы не повторяться дважды я расскажу ещё один дополнительный момент, который Вам пригодиться для дальнейшей работы: как подключиться к уже выполняющемуся приложению MS Office, чтобы не создавать лишних копий процессов.
Для того, чтобы подключиться к уже запущенному приложению достаточно использовать функцию GetActiveOleObject, единственным параметром которой является имя класса. Например, чтобы подключиться к запущенному приложению MS Word необходмо выполнить:
Соответственно, чтобы не гадать запущена или не запущена та или иная программа пакета MS Office достаточно воспользоваться связкой двух функций:
Для того, чтобы открыть уже имеющийся документ Word необходимо воспользоваться методом Open объекта Documents, например так:
После того как документ открыт, Вы можете его редактировать, изменять текст, параметры страницы и т.д., но сегодня нам это не важно. Главное сегодня — научиться работать с объектами. И с этого момента начинается решение первой задачи.
2. Как работать с объектом Excel, внедренном в документ Word
Каждый документ Word имеет коллекцию Shapes, которая позволяет добавлять в документ объекты, созданные и отображаемые с помощью программ-серверов OLE (OLE-серверов). OLE-объекты в документах Word могут отображаться также, как они отображаются в приложениях, предназначенных для их создания и редактирования. Все наверно пользовались редактором формул Math Type? Вот вам простой OLE-сервер. Добавляете OLE-объект формулы в документ — открывается окно Math Type где вы вводите то, что хотите увидеть и потом формула отображается в документе Word.
Другое дело, когда Вы пробуете вставить в документ Word, например файл mp3. В этом случае объект будет отображен в документе в виде ярлыка, но, тем не менее будет внесен в коллекцию Shapes и до него можно будет добраться из Delphi.
Теперь попробуем посмотреть как выглядит добавление OLE-объектов. В простейшем случае Вы открываете Word, создаете документ и выбираете «Правка — Вставить — Объект» и перед Вами открывается окно с перечнем всех OLE-объектов, которые Вы можете использовать в документе. Выбираете объект, вставляете в документ — работаете. Обратите внимание на рисунок — в окне на рисунке как раз отображены всевозможные объекты нашего с Вами исследования.
Для того, чтобы вставить OLE-объект в документ Word из Delphi необходимо воспользоваться методом AddOleObject коллекции Shapes, который имеет следующий вид:
Shapes.AddOleObject(ClassType, FileName, LinkToFile, DisplayAsIcon, IconFileName, IconIndex, IconLabel, Range)
ClassType — имя, используемое для включения указанного объекта OLE. Например, чтобы вставить в документ Word диаграмму Excel следует использовать
для добавления листа Excel, соответственно:
и так далее. В принципе ничего сложного нет — вставить можно, что угодно, хоть exe-файл :)
FileName — имя файла, из которого должен быть создан объект. Если этот аргумент опущен, то используется текущая папка. Вы должны указать либо ClassType либо FileName, но никак не одновременно оба параметра.
LinkToFile — True для того, чтобы связать OLE-объект с файлом, из которого он был создан. False, чтобы сделать объект OLE-объект независимым от копии файла, т.е. включить объект в документ Word. Если Вы определили значение для ClassType, аргумент LinkToFile должны быть ложными. Значение по умолчанию False.
DisplayAsIcon — True для отображения объекта OLE в виде значка. Значение по умолчанию False.
IconFileName — Файл, который содержит значок для отображения объекта OLE.
IconIndex -индекс иконки отображения из IconFileName. Значение по умолчанию — ноль.
IconLabel — подпись к иконке объекта.
Range — диапазон, где объект OLE будет размещен в тексте. Объект OLE заменяет выбранный диапазон. Если этот аргумент опущен, объект вставляется автоматически (в текущую позицию курсора в документе).
Давайте теперь продемонстрируем использование этого метода на практике и, заодно, приготовим плацдарм для дальнейшей работы. Рассмотрим как можно вставить чистый лист Excel в документ Word. Причем вставим лист в нужные нам координаты и зададим ему (листу) длину и ширину:
Как видите, вместо того, чтобы указать объект Range мы просто расписали его параметры Left, Top, Width и Height. После выполнения этих операций в документе doc аккурат в верху страницы вставиться лист Excel.
Теперь, когда лист вставлен, можно приступать к дальнейшему изучению «глубин» OLE-серверов Microsoft.
Создадим новую переменную, в которой будем хранить ссылку на OLE-объект.
и сразу получим ссылку на наш лист Excel в Word’е:
Так будет проще разбираться и избавит нас от лишней писанины.
Представим себе, что мы ничего абсолютно не знаем про то, что лежит в MyOLE. Знаем только то, что это элемент из коллекции Shapes и все. Как определить, что мы получили ссылку именно на объект Excel, а не на автофигуру или, ещё хуже, не на файл mp3?
Для того, чтобы получить всю необходимую информацию об OLE-объекте достаточно обратиться к объекту MS Word под названием OLEFormat.
OLEFormat имеет следующие свойства:
Свойство | Описание |
---|---|
Application | Возвращает имя приложения к которому относится объект. В нашем случае вернет «Microsoft Word» |
ClassType | Возвращает или устанавливает тип класса для указанного объекта OLE, фотографии или поля. |
Creator | Возвращает 32-битное целое число, которое указывает на приложение в котором был создан объект. |
DisplayAsIcon | True, если указанный объект отображается в виде значка. Свойство для чтения/записи |
IconIndex | Возвращает или устанавливает индекс иконки, используемой если DisplayAsIcon True. |
IconLabel | Возвращает или устанавливает подпись к иконке OLE-объекта. |
IconName | Возвращает или устанавливает файл программы, в которой хранится икона для объекта OLE. |
IconPath | Возвращает путь к файлу, в котором хранится иконка для объекта OLE |
Label | Возвращает строку, которая используется, чтобы определить часть исходного файла для связывания объектов |
Object | Возвращает объект, который представляет собой объект верхнего уровня интерфейса указанного объекта OLE |
Parent | В озвращает объект, который представляет собой родительский объект указанного объекта OLEFormat |
ProgID | Возвращает программный идентификатор (ProgID) для указанного объекта OLE. |
Теперь, используя эти свойства, попробуем получить всю необходимую нам информацию об OLE-объекте.
Вызовем последовательно свойства ClassType и ProgID:
Идем дальше. Итак, мы определили, что объект представляет собой лист Excel. Как получить доступ к Excel? И причем сделать это так, чтобы можно было наш OLE-объект изменить?
Обратимся к свойству Object. Согласно описанию, свойство должно вернуть нам ссылку на объект верхнего уровня. Следовательно, применительно к нашей ситуации — это будет ссылка на объект Excel. Чтобы убедиться в сказанном, сделаем так:
Ну, а теперь развязка вопроса — используя ссылку на Excel попробуем написать что-нибудь на листе, например, избитую фразу «Hello World!»:
Можете проверить — в ячейку А1 запишется строка. Здесь следует обратить внимание на то, что при записи в Excel мы не использовали свойства ActiveWorkBook, которое обычно предшествует свойству ActiveSheet. Все дело в том, что среди объектов OLE Office нет такого OLE-объекта — вставляется только лист либо диаграмма. По сути диаграмма — это два листа Sheet где на одном находится сам график, а на втором — данные к нему.
Вот таким простым и достаточно понятным способом можно добавлять, изменять и удалять OLE-объекты. Кстати, на досуге можете потренироваться вставлять, активировать, редактировать сразу несколько различных OLE-объектов — принцип работы тот же. Получаете Object и используете его функции.
3. Как работать с документом Word, внедренным в Excel.
Надо сказать, что разработчики в Microsoft весьма неплохо потрудились, чтобы запутать бедных разработчиков :). В начале все просто — как в Word. Есть Shapes у которого в свою очередь есть метод AddOLEObject, с практически теме же параметрами.
Далее, по логике вещей, у Shapes должно быть свойство-объект OLEFormat. Проверяем — действительно есть, но…свойства другие, точнее одно из свойств другое, а большинства вообще нет. Но, мы люди не гордые — будем управляться с тем, что есть:
Свойство | Описание |
---|---|
Application | При использовании без классификатора объектов, это свойство возвращает объект приложения, представляющий приложение Microsoft Excel. При использовании с объектом Qualifier, это свойство возвращает объект приложения, которое использовалось для создания объекта |
Object | Возвращает OLE Automation объект ассоциированный с OLE объектом |
Parent | Возвращает объект, который представляет собой родительский объект указанного объекта OLEFormat |
progID | Возвращает программный идентификатор (ProgID) для указанного объекта OLE. |
Как видите свойств не много. Главное, что осталось свойство Object — вот его мы и попробуем использовать в своих корыстных целях.
За что следует, наверное, сказать спасибо разработчикам Excel, так это за то, что они предусмотрели сразу объект OLEObjects предоставляющий нам в распоряжение все OLE-объекты листа. Используя этот объект мы минуем использование Shapes. Например так:
Мы получаем число OLE-объектов документа.
соответственно даст доступ к первому из OLE-объектов документа, а уж с ним-то нам и предстоит работать. Итак, рассмотрим следующую задачку: необходимо вставить в документ Excel пустой документ Word и написать в нем любую строку.
Чтобы не повторяться в применениях метода — вставим в Excel уже готовый документ Word из файла:
Обратите внимание, в данном случае мы использовали для работы с OLE-объектом не Shapes, а OLEObjects. Попробуйте воспроизвести те же самые действия как в случае работы с Excel из Word, т.е. воспользоваться свойством Object у объекта ObjectFormat. Думаю Вы будите «приятно» удивлены, т.к. в результате запроса имени приложения Вам вернется не Word как ожидалось, а Excel — следовательно работать с OLE-объектом становится невозможно.
Также следует отметить, что прежде, чем приступать к редактированию OLE-объекта, следует его предварительно активировать.
Вот так можно работать с Excel из Word и с Word из Excel и при этом не выходить из Delphi :). Ну, а для чего это использовать — решать Вам. Я только показал Вам возможности работы в Delphi с программами Word и Excel.
Предыдущая статья на тему работы с Excel в Delphi — «Excel в Delphi. Работа с объектом Range (диапазон)«
Следующая статья на тему работы с Excel в Delphi — «Создаем свои контролы на ленте Microsoft Office.«
Книжная полка
Описание Описаны общие подходы к программированию приложений MS Office. Даны программные методы реализации функций MS Excel, MS Word, MS Access и MS Outlook в среде Delphi.
Этот раздел содержит общий обзор дополнений и усовершенствований в Word Automation Services для разработчиков. В Microsoft SharePoint основным дополнением к службам автоматизации word является поддержка запросов на преобразование файлов "по запросу". Наиболее значительное улучшение для Word Automation Services добавлена поддержка использование потоков в качестве входных данных и выходные данные задания преобразования.
Создайте на преобразование файла запросами
В Word Automation Services в Microsoft SharePoint теперь можно создавать запросы на преобразование файлов по запросу, в результате чего преобразование файлов обрабатывается немедленно. В SharePoint 2010 вам нужно создать задание преобразования файлов в коде и затем запустить преобразование, с помощью метода ConversionJob.Start. Задание преобразования нажмите Начать на основе интервала, задайте в Word Automation Services как часто следует запускать задания преобразования. Периодичностью, SharePoint задание таймера будет запустить задание преобразования. С помощью метода задания таймера на основе soonest можно начать преобразование задания равен 1 минуте.
Теперь в службе автоматизации word в Microsoft SharePoint добавлена возможность создания запроса на преобразование файлов, который обрабатывается сразу после отправки и преобразование начинается немедленно и не зависит от задания SharePoint timer.
Одним из способов, учитывайте следующее различие между в очередь запросов на преобразование файла запросами и SharePoint на основе временного задания преобразования заданий понять, в очередь запросов на преобразование файла запросами обрабатываются синхронно, тогда как задания преобразования на основе задание таймера SharePoint происходят асинхронно. Архитектура Word Automation Services была переработана для поддержки нового типа для запроса на преобразование файла запросами и существующих преобразования файлов задания таймера на основе SharePoint.
На рисунке 1. Архитектура Word Automation Services 2013
На рисунке 1, можно убедиться, что архитектура Word Automation Services поддерживается 2 отдельных очередей для преобразования: одна очередь для на запросами (Интерпретация) файла преобразования запросов и одной очереди для заданий преобразования на основе задания таймера SharePoint на запросы с запросами помещаются в интерпретации основе очереди документов, где преобразования обрабатываются немедленно.
С другой стороны задания преобразования на основе задания таймера SharePoint, помещаются в очередь документ на основе задания таймера. Задания преобразования для этих запросов на запуск периодичностью для службы Word Automation Services. Запросов на преобразование в очереди документ на основе интерпретации всегда имеют приоритет над задания преобразования в документ на основе задание таймера очереди.
Ключевые моменты
По запросу преобразования файлов запросами-это дополнительный компонент и не замените существующее задание преобразования на основе задания таймера SharePoint. Это означает, что решения, которые компилировали и запускали SharePoint 2010 г., будут продолжать компилировать и запускать в SharePoint.
Чтобы на запросов на преобразование файла запросами только для одного файла за раз
Word Automation Services всегда будет определять приоритеты для задания преобразования файлов запросами через задания преобразования на основании SharePoint задания таймера. Если Word Automation Services уже работает на задание преобразования файлов, который использует SharePoint задание таймера, Word Automation Services прерывать задания и переключения на работают на задание преобразования файлов запросами до его завершения. Оно будет переключитесь в работать на задание преобразования файлов на основе задание таймера SharePoint
Преобразования файлов потоков
Другой новой функцией Службы автоматизации word в Microsoft SharePoint является поддержка преобразования потоков. В SharePoint 2010 может только преобразовать файлы, которые были сохранены в библиотеках SharePoint. Теперь можно преобразовать файлы, которые хранятся за пределами SharePoint с помощью потоков.
Ключевые моменты
Можно использовать только потоков как входные данные при создании на задание преобразования файлов запросами
Из-за описанные выше точки можно преобразовать только один поток за раз
С добавлением в очередь запросов на преобразование файла запросами и для поддержки преобразования потоков Word Automation Services значительно улучшено для включения с повышенной сценариев для преобразования документов.
Настоящая статья посвящена теме, может быть, и не новой, но, как показывают письма читателей, по-прежнему актуальной — автоматизации приложений Microsoft Office. Многие разработчики в процессе работы над своими проектами (неважно, с помощью какого средства разработки — Delphi, C++Builder, Visual Basic…) нередко применяют сервисы, предоставляемые Microsoft Office, например построение сводных таблиц и диаграмм с помощью Microsoft Excel, генерацию и печать документов с помощью Microsoft Word и т.д. Нередко пользователи, привыкшие использовать приложения Microsoft Office в повседневной работе, сами настаивают на применении в приложениях таких сервисов либо просто на сохранении отчетов и других документов в одном из форматов Microsoft Office. Отметим, что потенциальные пожелания подобного рода компанией Microsoft учтены достаточно давно — практически все, что в состоянии сделать пользователь любого приложения Microsoft Office с помощью меню, клавиатуры и инструментальной панели, может быть произведено и автоматически, то есть либо из VBA-программы, либо из приложения, созданного с помощью одного из средств разработки. Иными словами, приложения Microsoft Office являются программируемыми. Программируемость в общем случае означает возможность управления данным приложением с помощью макроязыков либо с помощью других приложений. Все компоненты Microsoft Office поддерживают один и тот же макроязык: Visual Basic for Applications (VBA), позволяющий создавать приложения непосредственно внутри документов Office (это называется «решения на базе Microsoft Office»). Управление же компонентами Office из других приложений осуществляется с помощью автоматизации (Automation, ранее — OLE Automation) — все приложения Microsoft Office являются серверами автоматизации (или COM-серверами). Для создания таких приложений пригодны любые средства разработки, позволяющие создавать контроллеры автоматизации (COM-клиенты). Наиболее часто для этой цели используется Visual Basic, но это могут быть и Delphi, и C++Builder, и Visual C++. Однако прежде чем обсуждать возможности тех или иных средств разработки, следует разобраться, что такое автоматизация.
Коротко об автоматизации
Автоматизация — это одна из возможностей, предоставляемых технологией Microsoft COM (Component Object Model). Не вдаваясь в подробности реализации этой технологии, заметим, что она используется приложениями (называемыми COM-серверами) для предоставления доступа к их объектам, а также к свойствам и методам этих объектов другим приложениям (называемым COM-клиентами), каковыми могут быть и средства разработки. Например, текстовый процессор, будучи COM-сервером, может предоставлять другим приложениям доступ к документу, абзацу, закладке с помощью соответствующих объектов. Для именования (и опознания) COM-серверов обычно используются специальные строковые обозначения — программные идентификаторы (Programmatic Identifier, ProgID). Они нужны для того, чтобы операционная система могла с помощью этих идентификаторов определить, в каком именно каталоге (или на каком компьютере локальной сети, если используется тот или иной способ удаленного доступа к серверу) расположен исполняемый файл сервера автоматизации, и запустить его на выполнение. О том, какие именно программные идентификаторы применяются для того или иного приложения Microsoft Office, будет сказано в разделах, посвященных этим приложениям.
Объекты автоматизации с точки зрения программирования мало чем отличаются от обычных объектов, знакомых нам из теории и практики объектно-ориентированного программирования. Как и обычные объекты, они обладают свойствами и методами. Свойство — это характеристика объекта; например, свойством абзаца (объект Paragraph) может быть его стиль (Style). Методом называется действие, которое можно выполнить с объектом (например, можно сохранить документ с помощью метода SaveAs объекта Document).
Нередко серверы автоматизации содержат наборы однотипных объектов, называемых коллекциями. Например, текстовый процессор может содержать коллекцию документов, а каждый документ — коллекцию абзацев.
Вся информация об объектах, необходимая контроллерам автоматизации, содержится в библиотеках типов. Библиотеки типов хранятся в специальном бинарном формате и обычно представлены в виде файлов с расширениями *.olb или *.tlb, а также могут содержаться внутри исполняемых файлов (*.exe) или динамически загружаемых библиотек (*.dll). Библиотеки типов можно просматривать с помощью утилиты OleView, входящей в состав Microsoft Platform SDK, а средства разработки фирмы Borland содержат свои собственные утилиты просмотра библиотек типов.
Заканчивая это более чем краткое введение в автоматизацию, остановимся также на понятии связывания. Связыванием называется способ, с помощью которого переменная или класс приложения-контроллера ссылается на объект автоматизации. Таких способов существуют два: позднее связывание и раннее связывание.
Позднее связывание означает, что реальная ссылка на объект в переменной или классе появляется на этапе выполнения приложения-контроллера. Этот способ обычно более медленный, чем ранее связывание, но он доступен во всех средствах разработки, позволяющих создавать контроллеры автоматизации, и менее чувствителен к тому, все ли параметры методов перечислены при их вызовах в коде приложения-контроллера. При позднем связывании корректность вызовов методов проверяется в момент их осуществления, то есть на этапе выполнения приложения, а не на этапе его компиляции.
Раннее связывание означает, что реальная ссылка на объект автоматизации появляется уже на этапе компиляции. Поэтому в коде приложения-контроллера требуется ссылка на библиотеку типов (или на специальный модуль, являющийся интерфейсом к ней), и это приводит к генерации в этом приложении классов с теми же свойствами и методами, что и у объектов автоматизации, что делает возможными синтаксическую проверку имен методов на этапе компиляции и доступ к именованным константам, содержащимся в библиотеке типов. Отметим, однако, что далеко не все средства разработки, поддерживающие позднее связывание, осуществляют также поддержку раннего связывания.
Закончив экскурс в COM и автоматизацию, вернемся к вопросу о том, какие средства разработки удобно применять для создания контроллеров автоматизации.
VBA и средства разработки контроллеров автоматизации
Как уже было сказано выше, контроллеры автоматизации можно создавать с помощью различных средств разработки, и если вы уже используете какое-либо из инструментальных средств, поддерживающих создание контролеров автоматизации, можно именно им и воспользоваться. Единственное, что следует сделать — это узнать, поддерживается ли вашим средством разработки ранее связывание, если вы планируете его использовать. Примеры простейших контроллеров автоматизации (как правило, для Microsoft Word или Microsoft Excel), дающие представление о том, как вызываются методы сервера, обычно можно найти в комплекте поставки большинства современных средств разработки.
Освоение объектной модели автоматизируемого сервера можно начать с записи необходимой последовательности действий в виде макроса с помощью VBА. Создать макрос можно, выбрав из меню приложения Microsoft Office пункт Tools | Macro |Record New Macro. Просмотр полученного макроса в редакторе кода VBA обычно позволяет понять, как должен выглядеть код, реализующий эту последовательность действий.
Обсудив возможные средства разработки контроллеров автоматизации, можно наконец перейти к самим приложениям Microsoft Office, к их объектным моделям и к их использованию. В качестве средства разработки для приведенных ниже примеров используется Borland Delphi 5, но поскольку в них приводится последовательность вызова свойств и методов объектов Microsoft Office, перенос кода на другие языки программирования не должен вызвать особых затруднений. Если специально не оговорено, в данной статье во всех примерах используется раннее связывание.
Объектные модели Microsoft Office
Как было сказано выше, приложения Microsoft Office предоставляют контроллерам автоматизации доступ к своей функциональности с помощью своей объектной модели, представляющей собой иерархию объектов. Объекты могут предоставлять доступ к другим объектам посредством коллекций.
В качестве иллюстрации того, как выглядит иерархия объектов Microsoft Office, приведем небольшой фрагмент объектной модели Microsoft Word (рис.1):
В объектных моделях всех приложений Microsoft Office всегда имеется самый главный объект, доступный приложению-контроллеру и представляющий само автоматизируемое приложение. Для всех приложений Microsoft Office он называется Application, и многие его свойства и методы для всех этих приложений также одинаковы. Наиболее часто мы будем использовать следующие из них:
- Свойство Visible (доступное для объекта Application всех приложений Microsoft Office) позволяет приложению появиться на экране и в панели задач; оно принимает значения True (пользовательский интерфейс приложения доступен) или False (пользовательский интерфейс приложения недоступен; это значение устанавливается по умолчанию). Если вам нужно сделать что-то с документом Office в фоновом режиме, не информируя об этом пользователя, можно не обращаться к этому свойству — в этом случае приложение можно будет найти только в списке процессов с помощью приложения Task Manager.
- Метод Quit закрывает приложение Office. В зависимости от того, какое приложение Office автоматизируется, он может иметь параметры или не иметь таковых.
Общие принципы создания контроллеров автоматизации
В общем случае контроллер автоматизации должен выполнять следующие действия:
- Проверить, запущена ли копия приложения-сервера.
- В зависимости от результатов проверки запустить копию автоматизируемого приложения Office либо подключиться к уже имеющейся копии.
- Сделать окно приложения-сервера видимым (в общем случае это не обязательно).
- Выполнить какие-то действия с приложением-сервером (например, создать или открыть документы, изменить их данные, сохранить документы и пр.)
- Закрыть приложение-сервер, если его копия была запущена данным контроллером, или отключиться от него, если контроллер подключился к уже имеющейся копии.
Соответствующий код для Delphi представлен в листинге 1.
Здесь мы воспользовались функциями GetActiveOleObject и CreateOleObject для подключения к уже запущенной копии приложения-сервера или запуска новой, если сервер не запущен, что приводит к тому, что в вариантную переменную помещается ссылка на объект Application соответствующего сервера.
Приведенная часть кода контроллера в других средствах разработки может выглядеть по-другому — она не имеет прямого отношения к методам объектов Office, так как обусловлена правилами вызова стандартных функций OLE в Delphi (за исключением вызовов методов Visible и Quit объекта Application). А вот все то, что должно быть вставлено вместо комментария «Здесь выполняются другие действия с объектами приложения Office», в разных средствах разработки должно выглядеть более или менее однотипно — используя созданную вариантную переменную, мы манипулируем методами и свойствами объекта Application.
В заключение сделаем одно маленькое замечание касательно числа параметров методов объектов автоматизации. В случае применения позднего связывания число указанных в коде параметров метода не обязано совпадать с их истинным числом (которое можно найти в описании объектной модели соответствующего приложения). В этом случае вполне допустимым является следующий код:
несмотря на то что метод Quit объекта Application в случае некоторых приложений Microsoft Office (например, Microsoft Word) имеет параметры.
При использовании же раннего связывания, например при создании контроллеров с помощью Delphi, следует более строго подходить к определению параметров — их число и тип должны соответствовать описанию методов в библиотеке типов. Например, в случае раннего связывания корректный код на Delphi для закрытия документа Word со значениями всех параметров по умолчанию будет иметь вид:
App.Quit(EmptyParam, EmptyParam, EmptyParam);
Исключением из этого правила является Visual Basic — это средство разработки позволяет не задумываться о числе параметров методов при написании кода.
Обсудив общие принципы создания контроллеров автоматизации и узнав, как это делается средствами Borland Delphi, мы можем перейти к рассмотрению автоматизации конкретных приложений Microsoft Office. Начнем с одного из самого популярных компонентов этого пакета — с Microsoft Word.
Автоматизация Microsoft Word
В данном разделе мы обсудим наиболее часто встречающиеся задачи, связанные с автоматизацией Microsoft Word. Но перед этим рассмотрим, каковы программные идентификаторы основных объектов Microsoft Word и что представляет собой его объектная модель.
Значительная часть текстовых документов сегодня создаётся и редактируется в программе Microsoft Word. Наличие этой программы практически на каждом компьютере даёт возможность автоматизировать печать, обработку и экспорт текстовых документов в PDF, используя API Microsoft Word.
Этот код выглядит очень просто. Но для автоматизации печати списка документов следует учесть ряд нюансов:
Доработанный вариант нашей программы будет выглядеть так:
Я считаю, что этого кода вполне достаточно, что бы сдать зачёт по программированию в университете. Но до внедрения его в коммерческое приложение следует решить еще несколько вопросов.
1. Этот код не будет работать, если входной файл имеет атрибут «Read only».
2. Производительность вашей программы можно увеличить в несколько раз, если открывать и закрывать только документы, а приложение Microsoft Word оставлять открытым.
3. Многим пользователям нужна возможность печати только заданного диапазона страниц, а не всего документа целиком, а так же возможность напечатать несколько копий документа.
4. Этот код не будет работать, если ваша программа запущена из Windows Tasks Scheduler или от имени Windows Service.
В этой статье я не стану рассказывать о том, как решить эти четыре задачи, что бы не делать жизнь моих читателей слишком скучной. Скажу лишь, что в программах Print Conductor, FolderMill и 2Printer они были мной успешно решены.
Для конвертирования документа в PDF нужно заменить функцию PrintOut на ExportAsFixedFormat. После этого наш код будет выглядеть так:
Этот пример будет работать, если на вашем компьютере Microsoft Word 2007 SP2 или его более новая версия.
Функция ExportAsFixedFormat не будет работать, если на компьютере не установлено ни одного принтера. Либо если один из установленных принтеров не назначен в качестве system default printer.
Код экспорта документов в PDF можно улучшить, реализовав возможность экспорта части страниц документа, а так же возможность экспорта документов в PDF/A. Обе эти возможности компания Microsoft реализовала в функции ExportAsFixedFormat.
Примеры коммерческих приложений, использующих этот код для конвертирования документов в PDF: DocuFreezer и FolderMill.
Пакет программ Microsoft Office — это не только фактический стандарт офисного ПО, но и весьма сложная и многофункциональная среда, позволяющая создавать решения, предназначенные прежде всего для применения возможностей Microsoft Office и автоматизации рутинных действий пользователя при работе с документами. Эта программная платформа, называемая Объектной Моделью Microsoft Office (Microsoft Office Object Model), или же Автоматизацией Microsoft Office (Microsoft Office Automation) основана на Объектной Модели COM и содержит обширный набор классов, предоставляющих доступ практически к любому элементу или действию, доступному пользователю при работе с Microsoft Office через графический интерфейс.
Объектная модель Microsoft Word (частично)
Говоря о программировании для Microsoft Office, часто подразумевают «внутренние» программы — макросы, написанные на VBA (Visual Basic for Applications, реализация Visual Basic в Microsoft Office) и встраиваемые непосредственно в документы.
Создание макроса для Microsoft Excel
Благодаря широким возможностям языка (за счет доступа к внешним dll и компонентам практически неограниченным) и удобной модели распространения (с файлами документов) макросы Microsoft Office использовались для создания зловредного ПО с момента появления VBA и получили собственное название — макровирусы. Несмотря на некоторое ужесточение настроек, связанных с макросами (на текущий момент актуальные версии Microsoft Office при настройках по умолчанию запрещают автоматическое выполнение макросов, уведомляя об этом пользователя), макровирусы активно применяются злоумышленниками и сейчас. Для эффективного использования этой технологии с двадцатилетней историей оказалось достаточно дополнить ее элементами социальной инженерии.
Предложение пользователю разрешить макросы в документе, содержащем зловредный код
Доступ к объектной модели Microsoft Office из PowerShell
Объектная Модель Microsoft Office представляет приложения Microsoft Office в виде COM-объектов. Но существует также возможность добавлять в документы и другие COM-объекты — управляющие элементы ActiveX, не относящиеся к Microsoft Office, но присутствующие в операционной системе. Будучи включенными в документ, эти элементы могут взаимодействовать с кодом макросов, либо выполнять собственный код, основанный на добавляемых в документ «свойствах» — properties объекта. В умелых руках встраивание элементов ActiveX также может приводить к выполнению произвольного кода, поэтому в последних версиях Microsoft Office по умолчанию запрещен запуск встроенных ActiveX за исключением некоторого «белого списка» элементов. Впрочем, пользователь и в этом случае при желании может явно разрешить выполнение.
Предупреждение о встроенных ActiveX
Предложение разрешить (или запретить) запуск активного содержимого поступит пользователю при открытии документа нормальным образом в соответствующем приложении. Что же случится, если открыть тот же документ, воспользовавшись Объектной Моделью Microsoft Office?
Примеров таких программ — великое множество на самых разных языках и под самые разные задачи:
Пример на VBScript
Пример на C++
Пример на PowerShell
При изучении подобных примеров лишь один раз нам попалась в коде интересная строчка:
Application.AutomationSecurity Property (Excel)
…
Returns or sets an MsoAutomationSecurity constant that represents the security mode Microsoft Excel uses when programmatically opening files.
…
MsoAutomationSecurity can be one of these MsoAutomationSecurity constants.
msoAutomationSecurityByUI. Uses the security setting specified in the Security dialog box.|
msoAutomationSecurityForceDisable. Disables all macros in all files opened programmatically without showing any security alerts.
msoAutomationSecurityLow. Enables all macros. This is the default value when the application is started.
Оказывается, если приложение Microsoft Office запущено как элемент автоматизации, то код макросов в открываемых документах будет по умолчанию выполнен. Если, конечно, специально не изменить уровень безопасности управляющей программой. Это умолчание не зависит от настроек, выставленных пользователем или администратором. Помимо макросов, будет также загружен и выполнен код любых элементов ActiveX, добавленных в документ.
Выполнение макроса при открытии документа через Автоматизацию
Эта неочевидная особенность, судя по всему, достаточно редко учитывается. К примеру, офисные программы других производителей применяют объектную модель Microsoft Office для импорта и экспорта данных в документы Word и Excel. Достаточно часто встречаются примеры для 1С:
Пример для 1С
Программы 1С, называемые «обработками», также могут использовать COM вообще и объектную модель Microsoft Office в частности. Некоторые полезные обработки предоставляются пользователям производителем, например, обработка «ЗагрузкаДанныхИзТабличногоДокумента.epf» позволяет загружать в базу данные из внешних табличных документов.
Выполнение макроса при открытии документа через обработку 1С
Как можно видеть, свойство AutomationSecurity было забыто и программистами 1С.
С одной стороны, это классический пример того, что необходимо думать о безопасности в процессе программирования, какой бы язык ни использовался. С другой стороны, какая причина заставила Microsoft при ужесточении настроек безопасности Microsoft Office оставить незащищенной объектную модель?
Небольшое видео, демонстрирующее то, как злоумышленник может захватить контроль над компьютером бухгалтерии при помощи Metasploit Framework и прайса на вареники. Макрос, содержащийся в документе Excel, запускает скрипт для PowerShell, открывающий атакующему доступ к командной строке на атакуемой системе.
Читайте также: