Почему процесс Excel остается открытым после выхода из OLE-объекта? - PullRequest
0 голосов
/ 09 апреля 2019

Я пытаюсь сохранить данные в приложении 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 Ответ

1 голос
/ 09 апреля 2019

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

Вместо

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

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

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

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