The Unofficial Newsletter of Delphi Users - by Robert Vivrette

Работаем с  TExcelApplication

By Christian Ebenegger - c.ebenegger@fsp.ch and Thierry Revillard - thierry.revillard@fsp.ch

Перевод Руденко Е.В.   janerev@hotmale.ru    апрель 2001 года

 

 Компоненты  Excel доступны на странице Servers Палитры Компонентов Delphi 5 и сильно упрощают процессы Автоматизации.

На примере приложения  Delphi рассмотрим сначала , как послать данные из приложения в Excel , а затем, как загрузить данные из таблицы Excel.

Для примера создадим форму ( Form) с компонентом TStringGrid, заполненным некоторыми данными,  и двумя кнопками (Buttons), с заголовками   To Excel и  From Excel. Далее разместим компонент  TExcelApplication на форме и установим его Свойство Name в XLApp и Свойство  ConnectKind  в  ckNewInstance.

При работе с таблицами  Excel последовательность действий обычно такая : открываем  ExcelApplication, далее открываем Книгу (WorkBook) и окончательно работаем с Листом книги (WorkSheet).

Таким образом, основной объект реального приложения - это коллекция Листов (WorkSheets) Книги (WorkBook). Теперь, если мы внимательно посмотрим на конкретный Лист (WorkSheet), то увидим, что это ни что иное ,как представление матрицы. И , вдобавок, в объектной модели MSExcel эта матрица - вариант. Следовательно, естественно использовать вариант в  Delphi для посылки или получения данных Excel.

Отправка данных в  Excel

Это достигается следующей процедурой :

 

procedure TForm1.BitBtnToExcelOnClick(Sender: TObject);
var
 WorkBk : _WorkBook;     //  Определяем Книгу
 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;

   // Создаем массив из переменных Variant 
   TabGrid := VarArrayCreate([0,(R - 1),0,(C - 1)],VarOleStr);
   I := 0;

   //  Цикл для заполнения массива  Variant
   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;
    // Добавление книги к  ExcelApplication
   XLApp.WorkBooks.Add(xlWBatWorkSheet,0);
   // Выбор первой книги (WorkBook)
   WorkBk := XLApp.WorkBooks.Item[IIndex];
   // Определение первого листа (WorkSheet)
   WorkSheet := WorkBk.WorkSheets.Get_Item(1) as _WorkSheet;
   // Соединение Delphi Variant Matrix с  Variant переменными Листа (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;
   // Освобождение 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;
 // Связываем  Variant переменные Листа с  Delphi Variant Matrix
  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;

// Освобождаем  Delphi Variant Matrix
   RangeMatrix := Unassigned;
end;

 Возврат в Tips&Tricks