簡體   English   中英

從 Delphi 中關閉 Excel

[英]Closing Excel from within Delphi

有人會幫助我確定是我的基本錯誤嗎?

我的目標是打開一個 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 仍保留在任務管理器中,並且隨着該進程一天內運行幾次,它們會在后台累積。

有人可以指導我找到解決方案或如何解決問題嗎?

當您關閉 Excel 時,您的工作簿可能沒有關閉。 如果您的工作簿已經保存,那么您可以使用 Workbook.Close 關閉它們; 否則,您可以在關閉工作簿之前將它們標記為已保存(Workbook.Saved := True),或者在關閉它們時,您可以使用以下命令關閉它們:

Workbook.Close(False);

false 參數告訴工作簿關閉而不要求保存。 關閉所有工作簿后,Excel 應正確退出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM