Delphi

Обмен данными в/из Excel'я

Опубликовано: 06 сен 04
Рейтинг:

Автор: ScareCrow
Прислал:

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

Совместимость: Delphi (5.x или выше)

На форме находится 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; 
 // Уничтожаем RangeMatrix 
   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; 
// Уничтожаем RangeMatrix 
   RangeMatrix := Unassigned; 
end;

Комментарии


  • Все отлично работает, спасибо Автору!

  • У меня выдает ошибку [Error] Unit1.pas(104): Not enough actual parameters
    В строке
    XLApp.WorkBooks.Open(NomFich,EmptyParam,EmptyParam,EmptyParam,EmptyParam, EmptyParam,
    EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam,0);
    Чо тут нада исправить или дополнить чтобы она работала?

  • Просто надо Value2 поставить вместо Value, и всё работает

  • sKox 02 мая 2007, 16:38 Оценка: 5
    Не знаю почему но мне выдаёться ошибка на строку
    Worksheet.Range['A1',Worksheet.Cells.Item[R,C]].Value := TabGrid;

    таже фигня + как не изощрялся, скомпилить прогу не удалось...
    и еще глупый вопрос - надо ли было добавлять иформацию о бд в систему?

  • Отличный пример, но... вот в чем проблема - я только начал расшаривать работу Дельфи с другими приложениями, так что толком скомпилить программу не получается, до этого с Ole, Variant и ExcelApplication вообще был не знаком, так что если можно - объясните для тупых.. т.е. для начинающий весь процесс поподробнее и с начала...

  • Надо не забыть сказать, что на компе, где будет запускаться данная программа необходим установленный Эксель.
    А если такового нету, то ....

  • Не знаю почему но мне выдаёться ошибка на строку
    Worksheet.Range['A1',Worksheet.Cells.Item[R,C]].Value := TabGrid;

    [Error] nds.pas(467): E2029 '[' expected but ':=' found
    Не подскажите в чём может быть дело?

  • рабтате нормально, принцып понятен, большое спасибо

  • не знаю у меня работает фсё харашо ф 2003

  • Доступно - разобраться можно...

  • 29 мая 2006, 21:54 Angel_of_Darknes

    Вот было бы не плохо в таких примерах имена оставлять стандартные а то сидишь и гадаешь откуда это взялось.

  • В 2003 Екселе НЕ РАБОТАЕТ!!! там изменились некоторый процедуры, в них надо передавать параметры..

  • 13 июня 2005, 00:24 Shadow J. Jackson

    Немного напутонно но в целом верно.

  • а зачем надо выбирать первую книгу, когда можно запоминить ту, что МЫ добавили?

  • а зачем надо выбирать первую книгу, когда можно запоминить ту, что МЫ добавили?

  • Алгоритмы немного старанные, но понял, большой сенкс



Необходимо войти на сайт, чтобы оставлять комментарии

Раздел FAQ: Delphi / Обмен данными в/из Excel'я