从 Delphi 中关闭 Excel

问题描述 投票:0回答:1

有人可以帮助我解决我确定的基本错误吗?

我的目标是打开 Excel 电子表格(不可见)、填充它、将其附加到电子邮件、发送并关闭所有内容。

该过程已接近完成,只是在该过程完成后,Excel 在任务管理器中保持打开状态。

代码块是:

procedure TFMain.SendEmail;
var
  i, j, r: Integer;
  vBody, vSaveVer: string;
  vAttach: TIdAttachment;
  vMftQty: array [1 .. 2] of Integer;
  vQtyTot: array [1 .. 12] of Integer;
  vNetTot: array [1 .. 12] of Real;
  oXL, oWB, oSheet: Variant;
begin
  IdMessage1.From.Address := '[email protected]';
  IdMessage1.From.Domain := 'valid-email.co.uk';
  IdMessage1.From.Text := 'Sage <[email protected]>';
  IdMessage1.Subject := 'Sage';
  try
    SQLQuery1.Close;
    SQLQuery1.SQL.Clear;
    SQLQuery1.SQL.Add('SELECT comp,dept,e_addr FROM acc_email WHERE dept="' +
      EMailQuery.FieldByName('Dept').Text + '"');
    SQLQuery1.Open;
    while not SQLQuery1.Eof do
    begin
      IdMessage1.Recipients.EMailAddresses :=
        EMailQuery.FieldByName('E_Addr').Text;
      SQLQuery2.Close;
      SQLQuery2.SQL.Clear;
      SQLQuery2.SQL.Add('SELECT * FROM invoice WHERE global_dept_number="' +
        EMailQuery.FieldByName('Dept').Text +
        '" ORDER BY account_ref, stock_code');
      SQLQuery2.Open;

      oXL := CreateOleObject('Excel.Application');
      oXL.DisplayAlerts := False;
      oWB := oXL.Workbooks.Add;
      while not SQLQuery2.Eof do
      begin
        oXL.Cells[r, 1].Value := 'Code';
        oXL.Cells[r, 2].Value := 'Description';
        oXL.Cells[r, j * 2 + 1].Value := 'Qty';
        oXL.Cells[r, j * 2 + 2].Value := 'Value';
        Inc(r);
        oWB.Worksheets.Add(After := oWB.Worksheets[oWB.Worksheets.Count]);
        oSheet := oWB.ActiveSheet;
        oSheet.Name := SQLQuery2.FieldByName('account_ref').Text;
        oXL.Cells[1, j * 2 + 1].Value := 'Month';
        r := 2;
        SQLQuery2.Next;
      end;
      if oWB.Worksheets.Count > 1 then
        oWB.Worksheets.Item['Sheet1'].Delete;
      oWB.Worksheets[1].Select;
      oWB.SaveAs(vSave + EMailQuery.FieldByName('Dept').Text + '.xlsx');
      SQLQuery1.Next;
    end;
    try
      if IdMessage1.Recipients.EMailAddresses <> '' then
      begin
        vAttach := TIdAttachmentFile.Create(IdMessage1.MessageParts,
          vSave + EMailQuery.FieldByName('Dept').Text + '.xlsx');
        IdSMTP1.Connect;
        IdSMTP1.Send(IdMessage1);
        IdMessage1.Recipients.EMailAddresses := '';
        IdMessage1.Body.Text := '';
      end;
    finally
      if IdSMTP1.Connected then
        IdSMTP1.Disconnect;
    end;
  finally
    vAttach.Free;
    oSheet := Unassigned;
    oWB := Unassigned;
    oXL.Quit;
    oXL := Unassigned;
  end;
end;

然而,Excel 仍保留在任务管理器中,并且随着该进程在一天中运行几次,它们会在后台累积。

有人可以指导我找到解决方案或如何解决问题吗?

excel delphi delphi-xe2 ole
1个回答
0
投票

关闭 Excel 时,可能您的工作簿未关闭。如果您的工作簿已保存,则可以使用 Workbook.Close 关闭它们;否则,您可以在关闭工作簿之前将其标记为已保存 (Workbook.Saved := True),或者当您关闭它们时,您可以使用以下命令关闭它们:

工作簿.关闭(False);

false 参数告诉工作簿关闭而不要求保存。关闭所有工作簿后,Excel 应正确退出。

© www.soinside.com 2019 - 2024. All rights reserved.