Экспорт в Excel
Кулюкин Олег
Рано
или поздно практически каждый программист сталкивается с необходимостью
организовать экспорт данных в MS Office. При этом каждое "поколение"
программистов натыкается на одни и те же вилы.
Вот
три часто встречающихся вопроса.
1.
Как определить установлен ли Excel
2.
Как определить запущен ли Excel
3.
Как вывести данные в Excel
Большую
помощь в понимании этих и других вопросов приносит чтение исходных текстов
функций модуля ComObj. :)
Во
всех случаях следует подключить модули ComObj и ActiveX
1.
Как определить установлен ли Excel
Функция
возвращает True если найден OLE-объект
Пример
использования
if
not IsOLEObjectInstalled('Excel.Application') then ShowMessage('Класс не зарегистрирован')
else ShowMessage('Класс найден'); function IsOLEObjectInstalled(Name: String):
boolean; var ClassID: TCLSID; Rez : HRESULT; begin // Ищем CLSID OLE-объекта
Rez := CLSIDFromProgID(PWideChar(WideString(Name)), ClassID); if Rez = S_OK
then // Объект найден Result := true else Result := false; end;
Если
нужна более подробная информация об объекте, можно почитать хелп по функции API
CLSIDFromProgID.
2.
Как определить запущен ли Excel
Данный
пример ищет активный экземпляр Excel и делает его видимым
var
ExcelApp : Variant; begin try // Ищем запущеный экземплят Excel, если он не
найден, вызывается исключение ExcelApp :=
GetActiveOleObject('Excel.Application'); // Делаем его видимым ExcelApp.Visible
:= true; except end;
3.
Как вывести данные в Excel
Можно
выводить данные последовательно в каждую ячейку, но это очинь сильно замедляет
работу. Лучше сформировать вариантный массив, и выполнить присвоение области
(Range) этого массива.
var
ExcelApp, Workbook, Range, Cell1, Cell2, ArrayData : Variant;
TemplateFile : String;
BeginCol, BeginRow, i, j : integer;
RowCount, ColCount : integer;
begin
//
Координаты левого верхнего угла области, в которую будем выводить данные
BeginCol
:= 1;
BeginRow
:= 5;
//
Размеры выводимого массива данных
RowCount := 100;
ColCount := 50;
// Создание Excel
ExcelApp :=
CreateOleObject('Excel.Application');
//
Отключаем реакцию Excel на события, чтобы ускорить вывод информации
ExcelApp.Application.EnableEvents :=
false;
//
Создаем Книгу (Workbook)
//
Если заполняем шаблон, то Workbook := ExcelApp.WorkBooks.Add('C:MyTemplate.xls');
Workbook
:= ExcelApp.WorkBooks.Add;
//
Создаем Вариантный Массив, который заполним выходными данными
ArrayData := VarArrayCreate([1,
RowCount, 1, ColCount], varVariant);
// Заполняем массив
for I := 1 to RowCount do
for J := 1 to ColCount do
ArrayData[I, J] := J * 10 + I;
//
Левая верхняя ячейка области, в которую будем выводить данные
Cell1 :=
WorkBook.WorkSheets[1].Cells[BeginRow, BeginCol];
//
Правая нижняя ячейка области, в которую будем выводить данные
Cell2 :=
WorkBook.WorkSheets[1].Cells[BeginRow +
RowCount - 1, BeginCol +
ColCount
- 1];
//
Область, в которую будем выводить данные
Range :=
WorkBook.WorkSheets[1].Range[Cell1, Cell2];
//
А вот и сам вывод данных
//
Намного быстрее поячеечного присвоения
Range.Value
:= ArrayData;
// Делаем Excel видимым
ExcelApp.Visible := true;
Список литературы
Для
подготовки данной работы были использованы материалы с сайта http://vlad2000.h1.ru/