Автоматизация Microsoft Excel
Введение
Довольно часто в прикладных приложениях, работающих с базами данных, статистическими
данными и т.п., возникает проблема создания отчетов с последующим их анализом.
В качестве идеального средства анализа может быть использован Microsoft Excel,
широко известный продукт из поставки Microsoft Office, обладающий громадными
возможностями. Вы, может быть, подумали, что в статье я буду учить вас набивать
данные в Excel вручную, а затем писать скрипты, обрабатывающие эти данные? Вовсе
нет, мы займемся более интересным делом. Мы заставим Excel плясать под нашу
дудку, выполняя все, что мы пожелаем. Что для этого нужно? Во-первых, конечно,
сам Microsoft Excel, версия в принципе не важна, т.к. приведенные примеры будут
работать и под 97 и под 2000 офисом. Желательно при установке Microsoft Office
полностью установить файлы помощи - файл VBAXL8.HLP (или VBAXL9.CHM в случае
Office2000) содержит очень полезную информацию об иерархии объектов Excel, с
которыми нам придется работать. Второе требование - Borland C++Builder или Delphi.
Приведенные примеры подготовлены в среде Borland C++Builder 5.0, не думаю, что
составит большого труда переписать их под Delphi. И, наконец, самое главное
требование - это желание научиться чему-нибудь полезному и время для этого.
Начнем, пожалуй, с основ, с того, на чем все базируется.
Немного теории
Будем отталкиваться от того, что вы имеете представление, что такое указатель
и что такое класс в С++. Без этих знаний вам будет тяжеловато разобраться в
механизме автоматизации, а бездумное переписывание примеров ничего вам не даст.
Итак, как вы понимаете, в "процессе" принимают участие 2 основных
объекта: приложение, которое мы собрались автоматизировать (или попросту говоря,
которым мы будем управлять) - оно называется сервером автоматизации
-
и наше приложение, оно называется контроллером автоматизации
. Сервер
автоматизации состоит из одного или (чаще) нескольких объектов или компонент
,
реализующих функциональность сервера. Автоматизация выполняется при помощи вызовов
методов этих объектов. Посмотрите на следующую диаграмму:
Объекты в составе сервера обычно образуют иерархическую структуру, подобную
этой (для Microsoft Excel):
Итак, с сервером и контроллером мы разобрались. Давайте разберемся с понятием
интерфейса. Начальные сведения о том, что такое интерфейс и как он используется
в программировании, можно почерпнуть из статьи "Использование
интерфейсов при работе с DLL"
. В нашем случае интерфейс - своего
рода буфер между объектом сервера автоматизации и контроллером автоматизации.
Интерфейс позволяет вызывать методы объекта и обращаться к его свойствам в простой
форме, по имени, что-то типа pIterface -> MemberFunction1(), а также обеспечивает
проверку типов параметров функций. Почему не обращаться к public-методам класса
реализующего объект напрямую, спросите вы? А потому, что тогда наш код должен
находиться в одном адресном пространстве с кодом класса, при изменении реализации
класса наш код должен перекомпилироваться, т.е. он сможет работать только с
одной реализацией (или, фактически, версией) сервера. При использовании интерфейса
же клиент абсолютно независим от реализации объекта. Из-за того, что интерфейс
физически представляет собой указатель, он легко может передаваться между процессами
или компьютерами. Кстати, раз уж мы заговорили об физической реализации интерфейса,
посмотрите, как все действительно выглядит:
Т.е., как видите, интерфейс по существу является указателем на указатель на
массив указателей на функции-методы (и свойства) объекта. Немного запутано,
не правда ли? Давайте посмотрим, как все это выглядит на практике.
|