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

Previous  Top  Next

    
 

 

Автор: 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

 

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

Code:

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;

 

©Drkb::04370

 

 

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

 

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

 

Code:

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;

©Drkb::04371

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