Почему процесс Excel остается открытым после завершения работы OLE-объекта?

#excel #delphi #ole

#excel #delphi #ole

Вопрос:

Я пытаюсь сохранить данные в приложении Delphi в виде excel-файла. Я использую OLEObject, но проблема в том, что процесс Excel остается открытым.

Мне нужны дополнительные листы, и в зависимости от того, как я их добавлю, процесс будет закрыт или нет. Смотрите код.

Процессы Excel всегда будут закрыты после того, как я закрою свое приложение (но не раньше). В чем проблема с версией кода 1?

Кстати. Я использую Delphi 10.2.3 и Excel 2010, Windows 7

 var
  lExcel        : OLEVariant;
  lMyWorkbook   : OLEVariant;
  lMyWorkSheets : OLEVariant;
begin
  try
    lExcel := CreateOleObject('Excel.Application');
  except
    exit;
  end;
  lExcel.visible := true;

  lMyWorkbook   := lExcel.Workbooks.Add;
  lMyWorkSheets := lMyWorkbook.WorkSheets;

  //adding another worksheet 
  //version1 - insert at the end of the list 
  //the excel process stays open after quit
  lMyWorkSheets.Add( After:=lMyWorkbook.Worksheets[ lMyWorkSheets.Count ] );

  //version2 - insert before active worksheet
  //the excel process will be closed after quit
  lMyWorkSheets.Add;


  lMyWorkSheets:=unassigned;
  lMyWorkbook.Close;
  lMyWorkbook:=unassigned;

  lExcel.Quit;
  lExcel:=unassigned;
end;
  

Комментарии:

1. Черт возьми, я не могу воспроизвести проблему. Я использую Delphi XE7, Excel 2007 и Win 7

2. Я также тестировал с Excel 2013 и столкнулся с той же проблемой, поэтому я предполагаю, что более новая версия Delphi вызывает эту проблему.

Ответ №1:

Методом проб и ошибок я узнал, как решить мою проблему:

Вместо

 lMyWorkSheets.Add( After:=lMyWorkbook.Worksheets[ lMyWorkSheets.Count ] );
  

который был адаптирован из справки MS VBA
(https://learn.microsoft.com/de-de/office/vba/api/excel.sheets.add )

Я должен использовать

 LastWorkSheet := lMyWorkbook.Worksheets[ lMyWorkSheets.Count ];
lMyWorkSheets.Add( After := LastWorkSheet );