Delphi World - Пример работы через OLE с Excel
Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Пример работы через OLE с Excel

Автор: Зимин Александр


// Маленькая процедурка -- на которой я тестировал вообще коннект к Excel
procedure TForm1.ButtonClick(Sender: TObject);
var
  Excel : Variant;
  WorkSheet : Variant;
  I, J  : Integer;
begin
  if OpenDialog.Execute then begin
    Excel := CreateOleObject( InputBox('OleStr', 'CreateOleObject',
    'Excel.Application.8') );
    Excel.Visible := False;
    Excel.Workbooks.Open( OpenDialog.FileName );
    WorkSheet := Excel.Workbooks[1].WorkSheets[1];
    ListView.Columns.Clear;
    ListView.Items.Clear;
    for I := 1 to WorkSheet.Cells.CurrentRegion.Columns.Count do
       ListView.Columns.Add.Caption := VarToStr( WorkSheet.Cells[1,I] );
    for I := 1 to WorkSheet.Cells.CurrentRegion.Rows.Count do
     with ListView.Items.Add do begin
      Caption := VarToStr( WorkSheet.Cells[I,1] );
      for J := 2 to WorkSheet.Cells.CurrentRegion.Columns.Count do
        SubItems.Add( VarToStr( WorkSheet.Cells[I,J] ));
    end;
    Excel.Workbooks.Close;
    Excel.Quit;
  end;
end;

{
 Кусочки из программы, которая читала Excel и кидала дату в SQL базу,
 Прога была одаптирована к конторской конкретике, поэтому целиком е¸
 кидать бессмысленно.
}

//Коннект... С простой мыслей о том что неизвесто с какой именно
// версией объекта придется работать
procedure TEnemaDM.ConnectToExcelServer(FileName: String);
var
  Reg : TRegIniFile;
begin
  Reg := TRegIniFile.Create( 'SOFTWARE\');
  if (FileExists( FileName ))and
     (UpperCase(ExtractFileExt( FileName )) = '.XLS' ) then try
    if VarIsEmpty( Excel ) then begin
      Excel := CreateOleObject( Reg.ReadString( 'Enema','Excel',
       'Excel.Application.8' ));
    end else begin
      Excel.Workbooks.Close;
    end;
    Excel.Visible := False;
    Excel.Workbooks.Open( FileName );
  finally
    Reg.Free;
  end;
end;

procedure TEnemaDM.DisconnectExcelServer;
begin
  try
    try
      Excel.Quit;
    except
    end;
  finally
    VarClear( Excel );
  end;
end;


//Пример загрузки списка листов таблицы
// Ейный вызов MainForm.LoadLists(Excel.Workbooks[1] );
//  -- я предпологаю что открыт 1 файл...
procedure TMainForm.LoadLists(WorkBooks: Variant);
var
  I : Integer;
begin
  if not VarIsNull( WorkBooks ) then begin
    ExcelListBox.Items.Clear; // TComboBox
    for I := 1 to WorkBooks.WorkSheets.Count do begin
      ExcelListBox.Items.Add( VarToStr( WorkBooks.WorkSheets[I].Name ));
    end;
  end;
end;


// Сама процедура загрузки перекачивает данные в некую хранимую процедуру
// Вызывалась как LoadExcel( Excel.Workbooks[1].WorkSheets[MainForm.CurrentList] )
procedure TEnemaDM.LoadExcel( WorkSheet : Variant );
var
  I : Integer;
  ErrorList : TStrings;
begin
  with MainForm do try
    ErrorList := TStringList.Create;
    try
      for I := 1 to WorkSheet.Cells.CurrentRegion.Rows.Count do begin
        try
         ХранимаяПроцедура.ParamByName( параметр ).AsString :=
             VarToStr(
           WorkSheet.Range[наименование региона в символах Excel. см Help].Cells[I,1] );
         ХранимаяПроцедура.ExecProc;
        except
          on E : Exception do ErrorList.Add( GetErrorCurrentValue +
                          #32 + E.Message );
        end;
      end;
      if ErrorList.Count = 0 then
         MessageDlg( 'Данные успешно успешно загружены' ,
     mtInformation, [mbOk], 0 )
      else
        ФормочкаДляОшибок.SetErrorList( ErrorList );
    finally
      ErrorList.Free;
    end;
  except
    on E : Exception do MessageDlg( E.Message, mtError, [mbOk], 0 );
  end;
end;


Коментарий от Yur Ovchinnikov


  cls_ExcelObject := 'Excel.Application';
  regData := TRegistry.Create;
  regData.RootKey := HKEY_CLASSES_ROOT;
  try
    if regData.OpenKey('\Excel.Application\CurVer', False) then
     begin
      cls_ExcelObject := regData.ReadString('')
      regData.CloseKey;
     end
  finally
    regData.Free;
  end;


Это для того, чтобы не применять локальные для каждой версии названия "Excel.Application.8", "Excel.Application.9". Ко всему прочему приведенный пример не работает с Excel95.

Проект Delphi World © Выпуск 2002 - 2017
Автор проекта: Эксклюзивные курсы программирования