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