从Delphi中关闭Excel

时间:2014-04-08 10:13:30

标签: excel delphi delphi-xe2 ole

请有人协助我确定是我的基本错误。

我的目标是打开一个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 := 'sage@valid-email.co.uk';
  IdMessage1.From.Domain := 'valid-email.co.uk';
  IdMessage1.From.Text := 'Sage <sage@valid-email.co.uk>';
  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仍然在任务管理器中,并且由于该过程在一天中运行了几次,因此它们会在后台构建。

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

1 个答案:

答案 0 :(得分:0)

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

Workbook.Close(假);

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