Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Пример работы через OLE с Excel

Delphi , Технологии , OLE Automation MSOffice

Пример работы через 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, демонстрирующее работу с Microsoft Excel с помощью автоматизации OLE (Object Linking and Embedding). Программа позволяет открыть файл Excel, прочитать его содержимое и закрыть.

Процедура ConnectToExcelServer создает экземпляр объекта приложения Excel и открывает указанный файл Excel. Она также устанавливает видимость приложения Excel в False, что означает, что приложение Excel будет работать в фоновом режиме без отображения.

Процедура LoadLists загружает список листов из открытого файла Excel в комбобокс.

Процедура LoadExcel читает данные с выбранного листа и хранит их в базе данных с помощью хранимой процедуры. Она также обрабатывает ошибки, которые могут возникнуть при выполнении хранимой процедуры.

Вот некоторые наблюдения и предложения:

  1. Программа использует регистрационный ключ для определения версии Excel, установленной на системе. Это полезно потому что различные версии Excel имеют разные объекты автоматизации с разными свойствами и методами.
  2. Программа использует позднюю связку, что означает, что она создает экземпляр объекта приложения Excel с помощью функции CreateOleObject. Этот подход может быть более гибким, чем ранняя связка, но требует больше кода для управления ссылками на объекты.
  3. Программа предполагает, что пользователь установил Excel на свою систему и знает путь к файлу исполняемого файла Excel. Если это не так, программа будет выдавать ошибку при создании экземпляра объекта приложения Excel.
  4. Программа не обрабатывает исключения должным образом. Например, если файл Excel не может быть найден или если есть проблема с данными листа, программа может рухнуть или дать неожиданные результаты.
  5. Программа использует хранимую процедуру для хранения данных в базе данных, но не предоставляет никакой обработки ошибок для хранимой процедуры.

Вот альтернативное решение, использующее раннюю связку и обрабатывающее исключения лучше:

procedure TEnemaDM.ConnectToExcelServer(FileName: String);
var
  ExcelApp: Variant;
begin
  try
    ExcelApp := CreateOleObject('Excel.Application');
    ExcelApp.Visible := False;
    ExcelApp.Workbooks.Open(FileName);
  except
    on E: Exception do
      MessageDlg(E.Message, mtError, [mbOk], 0);
  end;
end;

procedure TEnemaDM.DisconnectExcelServer;
begin
  try
    Excel.Quit;
  except
    on E: Exception do
      MessageDlg(E.Message, mtError, [mbOk], 0);
  end;
end;

procedure TMainForm.LoadLists(WorkBooks: Variant);
var
  I: Integer;
begin
  if not VarIsNull(WorkBooks) then begin
    ExcelListBox.Items.Clear;
    for I := 1 to WorkBooks.WorkSheets.Count do begin
      ExcelListBox.Items.Add(VarToStr(WorkBooks.WorkSheets[I].Name));
    end;
  end;
end;

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
          // Вызов хранимой процедуры здесь
          // ...
        except
          on E: Exception do
            ErrorList.Add(GetErrorCurrentValue + #32 + E.Message);
        end;
      end;
      if ErrorList.Count = 0 then
        MessageDlg('Данные успешно загружены', mtInformation, [mbOk], 0)
      else
        FormForErrors.SetErrorList(ErrorList);
    finally
      ErrorList.Free;
    end;
  except
    on E: Exception do
      MessageDlg(E.Message, mtError, [mbOk], 0);
  end;
end;

Альтернативное решение использует раннюю связку для создания экземпляра объекта приложения Excel и обрабатывает исключения лучше. Оно также предполагает, что пользователь установил Excel на свою систему и знает путь к файлу исполняемого файла Excel.

Пример статьи: 'Пример работы с Microsoft Excel через OLE в Delphi-приложении, демонстрирующий загрузку данных из Excel-файла и их передачу в хранимую процедуру для сохранения в SQL-базе данных.'


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: OLE Automation MSOffice ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-01-29 06:03:05/0.02352499961853/1