Советы по Delphi


Delphi и OLE Automation с Excel


Автоматизация позволяет одному приложению управлять другим приложением. Управляемое приложение называется сервером автоматизации (в нашем случае Excel). Приложение, управляющее сервером называется диспетчером автоматизации.

Есть два пути для получения доступа к серверам автоматизации:

Позднее связывание (Интерфейс IDispatch)

При использовании данного метода имена функций и типы параметров решаются во время выполнения программы, все параметры определены вариантным типом.

Поскольку во время компиляции невозможно определить соответствия имен функций и типов параметров, данный метод чреват ошибками.

Так как имена функций и типы параметров должны проверяться во время выполнения программы, данный метод выполняется медленно.

Единственное преимущество данного метода при программировании в Delphi заключается в том, что отпадает необходимость передачи всех параметров вызываемой функции.

Раннее связывание (Использование библиотеки типов/интерфейсов)

При использовании данного метода имена функций и типы параметров полностью решаются во время компиляции.

Библиотека типов должна импортироваться в Delphi. Библиотека типов является языковым нейтральным описанием всех объектов и функций, поддерживаемых сервером. (Это подобно файлу заголовка языка C).

При вызове функции должны обязательно присутствовать все параметры, даже те, которые в документации указаны как дополнительные (необязательные). Это позволяет обнаружить и исправить множество ошибок еще до запуска программы.

Скорость выполнения значительно быстрее, чем при использовании позднего связывания.

Из-за преимуществ второго метода остальная часть документа демонстрирует принципы создания приложений с ранним связыванием. Все приложения, использующие Excel автоматизацию, должны пользоваться последним методом, если нет причин для первого.

Подготовка библиотеки типов.

Модуль Pascal должен быть создан на основе файла библиотеки типов.

Выберите пункт меню Project|Import Type Library.

Нажмите кнопку Add и выберите следующий файл

c:\program files\microsoft office\office\excel8.olb

Нажмите OK.

К сожалению, данный модуль с проектом явно не компилируется, хотя и включается в него, вероятно из-за того, что приложение считает данный модуль нечто вроде текстового приложения.

Наиболее простой путь заключается в следующем: удалите модуль excel_tlb из проекта и только после этого добавьте его в список используемых модулей.

Документация

Справочный файл c:\program files\microsoft office\office\vbaxl8.hlp содержит информацию о доступных объектах Excel.

"Записыватель" макросов позволяет быстро создавать VBA-код. После этого он довольно может легко быть портирован в Delphi.

Пример автоматизации

Код следующего примера демонстрирует создание простой электронной таблицы и наполнение ее данными. Не забудьте добавить excel_tlb в список используемых модулей.

Настоятельно рекомендую хранить код автоматизации в отдельном модуле, это поможет избежать проблем конфликта имен.

Unit sheet;

//--------------------------------------------------------------------

interface

//--------------------------------------------------------------------

uses
windows, sysutils, excel_tlb;
Procedure CreateSpreadsheet;

//--------------------------------------------------------------------

implementation

//--------------------------------------------------------------------

Procedure CreateSpreadsheet(filename : string);
var
xla : _Application;xlw : _Workbook;LCID : integer;begin
xla := CoApplication.Create;LCID := GetUserDefaultLCID;tryxla.Visible[LCID] := true;// пустая книга//xlw := xla.Workbooks.Add(xlWBATWorksheet, LCID);// новая книга на основе шаблонаxlw := xla.Workbooks.Add('c:\delphi\excel\sample\demo.xlt',LCID);xla.Range['A1', 'A1'].Value := 'Date';xla.Cells[1, 2].Value := FormatDateTime('dd-mmm-yyyy', Now);xla.Cells[3, 1].Value := 'Numbers';xla.Range['B3', 'E3'].Value := VarArrayOf([1, 10, 100, 1000]);xla.Range['F3', 'F3'].Formula := '=Sum(B3:E3)';OLEVariant(xla).Run('Demo',FormatDateTime('dd-mmm-yyyy', Now));xlw.SaveAs(filename,xlWorkbookNormal,'','',False,False,xlNoChange,xlLocalSessionChanges,true,0,0,LCID);finallyxla.Quit;end;end;
//--------------------------------------------------------------------

end.



Начало  Назад  Вперед



Книжный магазин