Переходим, собственно, к автоматизацииПри программировании "автоматизирующих" приложений вы часто будете использовать тип данных Variant. Этот тип данных позволяет работать со всеми объектами сервера автоматизации при помощи функций OlePropertyGet, OlePropertySet и OleProcedure. OlePropertyGet принимает строку в качестве параметра и возвращает данные, содержащиеся в указанном свойстве объекта. OlePropertySet принимает несколько параметров, первый из которых - строка, указывающая на изменяемое свойство, а последующие параметры - данные, которые будут записаны в это свойство. OleProcedure выполняет указанный метод объекта. Чтобы эти функции стали более понятны вам, представьте, что строка
равносильна
Аналогично,
Итак,
Ну вот, 5 строчек кода. 5 сточек кода, которые запустили Microsoft Excel и добавили рабочую книгу с тремя листами. Этот фрагмент можно использовать как шаблон для написания ваших собственных программ. Во второй строке мы создаем объект Excel.Application, представляющий, собственно, приложение Microsoft Excel. Третья строка делает его видимым. В четвертой добавляется рабочая книга (содержащая, по умолчанию, три листа). И, наконец, в пятой строке мы получаем указатель на первый лист, с которым будем впоследствии работать. Что мы забыли? Вы, вероятно, разочаровались, создав проект и набрав эти строки в обработчике нажатия какой-нибудь кнопки, откомпилировали проект и получили сообщения об ошибке? Конечно, мы же забыли включить заголовочный файл, который позволит работать нам с автоматизируемыми объектами. В 5-м C++Builder'е это файл utilcls.h, в более ранних (если верить статьям Н.Елмановой) - comobj.hpp - экспериментируйте. А теперь создадим что-нибудь полезное и большое - то, что может пригодиться в рельной задаче и что поближе познакомит вас с иерархией объектов Microsoft Excel. Задачу сфорулируем так: пусть имеется таблица, содержащая информацию о товарах (наименование, единица измерения, цена), а нам нужно создать на ее основе прайс-лист фирмы. Мне нравится работать с таблицам с помощью TQuery, если хотите изменить его на TTable - пожалуйста, поменять нужно всего пару строк. Итак, сначала фрагмент - потом объяснения:
Блок 1 - объявления переменных и констант. Константа xlAlignCenter будет использоваться
при задании выравнивания в ячейках, переменные Блок 2 совпадает с приведенным выше шаблоном за исключением установки свойства SheetsInNewWorkbook в 1, что задает количество листов в создаваемой книге. Блок 3 задает имя рабочему листу. Блок 4 устанавливает ширину первого столбца ("А"), равную 30. Остальные столбцы остаются без изменений. В блоке 5 выводится название отчета - "Прайс-лист нашей фирмы" в ячейку, образованную слиянием трех первых ячеек первой строки листа. В получившейся ячейке устанавливается специфичный размер шрифта и выравнивание, а также задается высота строки. В блоке 6 создается шапка прайс-листа - выводятся заголовки колонок, фон этих ячеек меняется на серый и снова выравнивание посередине. Блок 7 инициализирует цикл вывода данных. Текущая строка становится 3 (так как именно с нее мы начинаем выводить данные из таблицы), инициализируется и открывается запрос. Блок 8 - происходит вывод данных из таблицы на рабочий лист. Последующие блоки просто форматируют уже полученную информацию. Блок 9 задает шрифт всего прайс-листа. Блок 10 очерчивает каждую ячейку линией. Дело в том, что рамка ячейки представляется четырьмя объектами - левая, правая, верхняя, нижняя рамка. Мы прочерчиваем их все. В блоке 11 задается формат, используемый при выводе цен - округление до двух знаков, пробел между тысячами, "р." после числа. В блоке 12 рабочая книга сохраняется в рабочем каталоге программы под именем price.xls. Уберите символы комментариев, если вам нужно, чтобы Excel закрывался после сохранения файла на диске. В приведенном случае Excel остается открытым, так что можно полюбоваться результатами своей (лучше сказать моей) работы. Возможные ошибкиЯ думаю, вы не остановитесь на предложенном примере и захотите сделать что-нибудь свое, единственное и неповторимое. При это у вас могут возникнуть следующие ошибки (я не буду рассматривать ошибки, связанные с общими вопросами программирования): - если программа не компилируется, убедитесь, что вы включили строку #include <utilcls.h> или #include <comobj.hpp>. - если сервер не выполняет какие-либо действия, а программа выдает что-нибудь типа "Unknown name" ("Неизвестное имя"), то, скорее всего, вы используете свойство или метод, не поддерживаемые данным объектом. - если сервер не выполняет какие-либо действия, а программа выдает что-нибудь типа "Exception occured" ("Возникло исключение"), то, скорее всего, где-то что-то вы неправильно указали в качестве параметра функции (либо передали данные неправильного типа, либо передали параметры там, где они не нужны, либо не передали там, где нужны) или неверные данные присваиваете свойству. Использованные источники, литература и т.п.Рунет не очень-то богат материалами, посвященными автоматизации, OLE и COM. Очень помогли статьи Н.Елмановой на http://www.citforum.ru/ . Больше, кроме кратких, некоментированных фрагментов в различных форумах, я ничего и не нашел. Особенно тяжело с материалами по C++Builder. В качестве базы хорошо почитать (хотя бы первые две-три главы) очень хорошую книжку Inside OLE в библиотеке MSDN http://msdn.microsoft.com/ . Информация об иерархии объектов почерпнута из уже упоминавшегося файла помощи VBAXL8.HLP, а также опять-таки с сервера MSDN. В поставку пятого C++Builder'а входят заголовочные файлы всех продуктов MS Office (для Excel это excel_xx_srvr.h, где xx-номер версии MS Office), но изучать их тяжело (большие они, да и неудобно ненаметанным глазом там что-нибудь высмотреть), легче воспользоваться библиотекой типов Excel8.Olb, лежащей в каталоге (по умолчанию) C:PROGRAM FILESMICROSOFT OFFICEOFFICE. Удачного программирования!
|