Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Обмен данными с Excel

01.01.2007

Автор: Fernando Silva

В Delphi 5, для обмена данными между Вашим приложением и Excel можно использовать компонент TExcelApplication, доступный на Servers Page в Component Palette.

На форме находится TStringGrid, заполненный некоторыми данными и две кнопки, с названиями To Excel и From Excel. Так же на форме находится компонент TExcelApplication со свойством Name, содержащим XLApp и свойством ConnectKind, содержащим ckNewInstance.

Когда нам необходимо работать с Excel, то обычно мы открываем ExcelApplication, затем открываем WorkBook и в конце используем WorkSheet.

Итак, несомненный интерес представляет для нас листы (WorkSheets) в книге (WorkBook). Давайте посмотрим как всё это работает.

Посылка данных в Excel

Это можно сделать с помощью следующей процедуры :

procedure TForm1.BitBtnToExcelOnClick(Sender: TObject);
var
 
WorkBk: _WorkBook; //  определяем WorkBook
 
WorkSheet: _WorkSheet; //  определяем WorkSheet
  I
, J, K, R, C: Integer;
 
IIndex: OleVariant;
 
TabGrid: Variant;
begin
 
if GenericStringGrid.Cells[0, 1] <> '' then
   
begin
     
IIndex := 1;
      R
:= GenericStringGrid.RowCount;
      C
:= GenericStringGrid.ColCount;
   
// Создаём массив-матрицу
     
TabGrid := VarArrayCreate([0, (R - 1), 0, (C - 1)], VarOleStr);
      I
:= 0;
   
//  Определяем цикл для заполнения массива-матрицы
      repeat
       
for J := 0 to (C - 1) do
         
TabGrid[I, J] := GenericStringGrid.Cells[J, I];
       
Inc(I, 1);
     
until
        I
> (R - 1);
 
   
// Соединяемся с сервером TExcelApplication
     
XLApp.Connect;
   
// Добавляем WorkBooks в ExcelApplication
     
XLApp.WorkBooks.Add(xlWBatWorkSheet, 0);
   
// Выбираем первую WorkBook
     
WorkBk := XLApp.WorkBooks.Item[IIndex];
   
// Определяем первый WorkSheet
     
WorkSheet := WorkBk.WorkSheets.Get_Item(1) as _WorkSheet;
   
// Сопоставляем Delphi массив-матрицу с матрицей в WorkSheet
     
Worksheet.Range['A1', Worksheet.Cells.Item[R, C]].Value := TabGrid;
   
// Заполняем свойства WorkSheet
     
WorkSheet.Name := 'Customers';
     
Worksheet.Columns.Font.Bold := True;
     
Worksheet.Columns.HorizontalAlignment := xlRight;
     
WorkSheet.Columns.ColumnWidth := 14;
   
// Заполняем всю первую колонку
     
WorkSheet.Range['A' + IntToStr(1), 'A' + IntToStr(R)].Font.Color := clBlue;
     
WorkSheet.Range['A' + IntToStr(1), 'A' + IntToStr(R)].HorizontalAlignment := xlHAlignLeft;
     
WorkSheet.Range['A' + IntToStr(1), 'A' + IntToStr(R)].ColumnWidth := 31;
   
// Показываем Excel
     
XLApp.Visible[0] := True;
   
// Разрываем связь с сервером
     
XLApp.Disconnect;
   
// Unassign the Delphi Variant Matrix
     
TabGrid := Unassigned;
   
end;
end;

Получение данных из Excel

Это можно сделать с помощью следующей процедуры :

procedure TForm1.BitBtnFromExcelOnClick(Sender: TObject);
var
 
WorkBk: _WorkBook;
 
WorkSheet: _WorkSheet;
  K
, R, X, Y: Integer;
 
IIndex: OleVariant;
 
RangeMatrix: Variant;
 
NomFich: WideString;
begin
 
NomFich := 'C:\MyDirectory\NameOfFile.xls';
 
IIndex := 1;
 
XLApp.Connect;
// Открываем файл Excel
 
XLApp.WorkBooks.Open(NomFich, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam,
   
EmptyParam, EmptyParam, 0);
 
WorkBk := XLApp.WorkBooks.Item[IIndex];
 
WorkSheet := WorkBk.WorkSheets.Get_Item(1) as _WorkSheet;
// Чтобы знать размер листа (WorkSheet), т.е. количество строк и количество
// столбцов, мы активируем его последнюю непустую ячейку
 
WorkSheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;
// Получаем значение последней строки
  X
:= XLApp.ActiveCell.Row;
// Получаем значение последней колонки
  Y
:= XLApp.ActiveCell.Column;
// Определяем количество колонок в TStringGrid
 
GenericStringGrid.ColCount := Y;
// Сопоставляем матрицу WorkSheet с нашей Delphi матрицей
 
RangeMatrix := XLApp.Range['A1', XLApp.Cells.Item[X, Y]].Value;
// Выходим из Excel и отсоединяемся от сервера
 
XLApp.Quit;
 
XLApp.Disconnect;
//  Определяем цикл для заполнения TStringGrid
  K
:= 1;
  repeat
   
for R := 1 to Y do
     
GenericStringGrid.Cells[(R - 1), (K - 1)] := RangeMatrix[K, R];
   
Inc(K, 1);
   
GenericStringGrid.RowCount := K + 1;
 
until
    K
> X;
// Unassign the Delphi Variant Matrix
 
RangeMatrix := Unassigned;
end;

Взято из https://forum.sources.ru