Использование информации из библиотек типов
Отметим, что в приведенном выше примере рабочая книга и рабочие листы были созданы с применением параметров, предлагаемых по умолчанию. Каким образом можно изменить эти параметры?
Рассмотрим следующий пример кода:
XL=CreateOleObject(“Excel.Application.8”);
XL.OlePropertySet(“Visible”,true);
v0=XL.OlePropertyGet(“Workbooks”);
v0.OleProcedure(“Add”,-4109);
Данный пример заставляет Excel создать пустой лист с диаграммой на основе шаблона, отличного от принятого по умолчанию.
Откуда в данном случае взялась константа –4109? Каким образом можно узнать, какими еще константами можно пользоваться при автоматизации с использованием данного сервера?
Ответы на эти вопросы можно получить, открыв библиотеку типов данного сервера. Сделать это можно, выбрав пункт меню File/Open, указав в списке возможных файлов Type Library и выбрав соответствующую библиотеку типов (для Excel это Excel8.olb, для Word – MSWord8.olb). При этом по истечении некоторого времени (эти библиотеки очень велики) будут созданы файлы с описанием всех использованных констант, а также свойств и методов содержащихся в сервере объектов (в данном случае Excel_TLB.cpp и Excel_TLB.h для С++Builder либо Excel_TLB.pas для Delphi). При создании этих файлов появятся сообщения об ошибках, связанные с тем, что в коде Excel и Word могут использоваться зарезервированные слова Object Pascal или С++.
Редактор библиотеки типов при этом представляет все вложенные объекты в виде иерархической структуры, внутри которой можно найти значения необходимых констант. В частности, в разделе шаблонов можно найти список констант, характеризующих различные типы шаблонов листов Excel:

Значения констант, описывающих шаблоны MS Excel 97
Именно там и содержится ссылка на константу xlWBATChart = –4109, соответствующую шаблону диаграммы.
При необходимости использовать в коде приложения-клиента именованные константы можно сослаться на файл Excel_TLB.h или Excel_TLB.pas в тексте модуля приложения.
Точно так же можно определить, каковы свойства и методы вложенных объектов данного сервера автоматизации:

Свойства и методы коллекции Workbooks
Используя сведения о константах, объектах, свойствах и методах OLE-сервера, можно модифицировать приведенный выше пример. Теперь мы создадим в Excel график на основе данных из рабочих листов, скопируем его в буфер обмена и перенесем в документ Word (об объектах и константах которого узнаем из библиотеки типов Word), снабдив график подписью. Соответствующий код выглядит следующим образом:
//———————————————————————————————#include <vcl.h>
#pragma hdrstop
#include “ole2.h”
#include <ComObj.hpp>
//———————————————————————————————#pragma package(smart_init)
#pragma resource “*.dfm”
TForm1 *Form1;
Variant XL,v0,v1,v2, v22, vrange, WD,a,b,c;
//———————————————————————————————__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//———————————————————————————————
void __fastcall TForm1::Button1Click(TObject *Sender)
{
XL=CreateOleObject(“Excel.Application.8”);
XL.OlePropertySet(“Visible”,true);
v0=XL.OlePropertyGet(“Workbooks”);
v0.OleProcedure(“Add”);
v1=v0.OlePropertyGet(“Item”,1);
v0=v1.OlePropertyGet(“Worksheets”) ;
v22=v1.OlePropertyGet(“Charts”) ;
v22.OleProcedure(“Add”);
v0.OlePropertyGet(“Item”,1).OlePropertySet(“Name”,”Бухгалтерия желтая”);
v0.OlePropertyGet(“Item”,2).OlePropertySet(“Name”,”Бухгалтерия красная”);
for (int j=1;j<3;j++)
{
v1=v0.OlePropertyGet(“Item”,j);
for (int i=1;i<11;i++)
{
v1.OlePropertyGet(“Cells”).OlePropertyGet(“Item”,i,1).OlePropertySet(“Value”,i);
v1.OlePropertyGet(“Cells”).OlePropertyGet(“Item”,i,2).OlePropertySet(“Value”,i*5);
v2=v1.OlePropertyGet(“Cells”).OlePropertyGet(“Item”,i,2);
v2.OlePropertyGet(“Font”).OlePropertySet(“Color”,clBlue);
v2.OlePropertyGet(“Font”).OlePropertySet(“Bold”,true);
v2.OlePropertyGet(“Interior”).OlePropertySet(“ColorIndex”,9-3*j);
}
v1.OlePropertyGet(“Cells”).OlePropertyGet(“Item”,11,1).OlePropertySet(“Value”,”=SUM(A1:A10)”);
v1.OlePropertyGet(“Cells”).OlePropertyGet(“Item”,11,2).OlePropertySet(“Value”,”=SUM(B1:B10)”);
}
vrange=v0.OlePropertyGet(“Item”,1).OlePropertyGet(“Range”,”A1:A10");
v1=v22.OlePropertyGet(“Item”,1);
v2=v1.OlePropertyGet(“SeriesCollection”);
v2.OleProcedure(“Add”,vrange);
vrange=v0.OlePropertyGet(“Item”,1).OlePropertyGet(“Range”,”B1:B10");
v2.OleProcedure(“Add”,vrange);
v1.OleProcedure(“Select”);
XL.OlePropertyGet(“Selection”).OleProcedure(“Copy”);
WD=CreateOleObject(“Word.Application.8”);
WD.OlePropertySet(“Visible”,true);
WD.OlePropertyGet(“Documents”).OleProcedure(“Add”);
a=WD.OlePropertyGet(“Documents”);
b=a.OleFunction(“Item”,1);
for (int i=1;i<5;i++)
{b.OlePropertyGet(“Paragraphs”).OleProcedure(“Add”);};
c=b.OleFunction(“Range”,1,2);
c.OleProcedure(“Paste”);
c=b.OleFunction(“Range”,3,3);
c.OlePropertySet(“Text”,”График, скопированный из рабочей книги Excel “);
XL.OlePropertySet(“DisplayAlerts”,false);
XL.OlePropertyGet(“Workbooks”).OlePropertyGet(“Item”,1).OleProcedure(“SaveAs”,”test.xls”);
XL.OleProcedure(“Quit”);
WD.OlePropertySet(“DisplayAlerts”,false); b.OleProcedure(“SaveAs”,”test2.DOC”);
WD.OleProcedure(“Quit”);
}
//———————————————————————————————
Результаты работы приложения представлены на рисунке.

Результат автоматизации создания диаграммы Excel и переноса ее в Word
Итак, создав код, подобный приведенному выше, мы можем автоматизировать довольно сложный набор рутинных пользовательских операций, что может быть весьма удобно, если такие операции часто повторяются. При этом создание такого кода в общем случае, безусловно, требует гораздо меньших усилий, чем написание отдельного приложения, реализующего какие-то части функциональности Word или Excel.
Следующая статья данного цикла будет посвящена использованию OLE-документов в приложениях C++Builder.
Координаты автора:
Центр Информационных Технологий.
Тел.: (095) 932-92-12, 932-92-13,
elmanova@citmgu.ru, http://www.citmgu.ru,
http://www.citforum.ru