Скачиваний:
100
Добавлен:
01.05.2014
Размер:
1.56 Mб
Скачать

Использование информации из библиотек типов

Отметим, что в приведенном выше примере рабочая книга и рабочие листы были созданы с применением параметров, предлагаемых по умолчанию. Каким образом можно изменить эти параметры?

Рассмотрим следующий пример кода:

XL = CreateOleObject ("Excel.Application.9");

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.

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

Используя сведения о константах, объектах, свойствах и методах OLE-сервера, можно модифицировать приведенный выше пример. Теперь мы создадим в Excel график на основе данных из рабочих листов, скопируем его в буфер обмена и перенесем в документ Word (об объектах и константах которого узнаем из библиотеки типов Word), снабдив график подписью. Соответствующий код выглядит следующим образом:

Variant XL, v0, v1, v2, v22, vrange, WD, a, b, c;

void __fastcall TForm1::Button1Click(TObject *Sender)

{

XL = CreateOleObject ("Excel.Application.9");

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.9");

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");

}

Итак, создав код, подобный приведенному выше, мы можем автоматизировать довольно сложный набор рутинных пользовательских операций, что может быть весьма удобно, если такие операции часто повторяются. При этом создание такого кода в общем случае, безусловно, требует гораздо меньших усилий, чем написание отдельного приложения, реализующего какие-то части функциональности Word или Excel.