为什么OLE对象退出后Excel进程保持打开状态?

为什么OLE对象退出后Excel进程保持打开状态?,excel,delphi,ole,Excel,Delphi,Ole,我试图将Delphi应用程序中的数据保存为excel文件。 我使用OLEobject,但存在Excel进程保持打开的问题 我需要额外的工作表,根据我添加工作表的方式,该流程将关闭或不关闭。 请参阅代码 excel进程将始终在我关闭应用程序后关闭,但不会更早关闭。 代码版本1的问题在哪里 顺便说一句,我使用Delphi10.2.3和Excel2010,Windows7 var lExcel : OLEVariant; lMyWorkbook : OLEVariant;

我试图将Delphi应用程序中的数据保存为excel文件。 我使用OLEobject,但存在Excel进程保持打开的问题

我需要额外的工作表,根据我添加工作表的方式,该流程将关闭或不关闭。 请参阅代码

excel进程将始终在我关闭应用程序后关闭,但不会更早关闭。 代码版本1的问题在哪里

顺便说一句,我使用Delphi10.2.3和Excel2010,Windows7

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;

通过反复试验,我找到了解决问题的方法:

而不是

lMyWorkSheets.Add( After:=lMyWorkbook.Worksheets[ lMyWorkSheets.Count ] );
这是根据MS VBA帮助改编的

我必须使用

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

FWIW,我不能复制这个问题。我使用的是Delphi XE7、Excel 2007和Win 7I,我也使用Excel 2013进行了测试,遇到了相同的问题,所以我猜是Delphi的较新版本导致了这个问题。