Кулюкін Олег
Рано чи пізно практично кожен програміст стикається з необхідністю організувати експорт даних в 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;