скрыть

скрыть

  Форум  

Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Google  
 

Пример работы через 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.






Copyright © 2004-2016 "Delphi Sources". Delphi World FAQ




Группа ВКонтакте   Ссылка на Twitter   Группа на Facebook