22

これは私のコードであり、VBA、.NET Frameworkに対する多くの回答を見つけましたが、かなり奇妙です。これを実行すると、Excelが閉じます。

from win32com.client import DispatchEx
excel = DispatchEx('Excel.Application')
wbs = excel.Workbooks
wbs.Close()
excel.Quit()
wbs = None
excel = None # <-- Excel Closes here

しかし、次のようにすると閉じません。

excel = DispatchEx('Excel.Application')
wbs = excel.Workbooks
wb = wbs.Open('D:\\Xaguar\\A1.xlsm')
wb.Close(False)
wbs.Close()
excel.Quit()
wb = None
wbs = None
excel = None  # <-- NOT Closing !!!

Stack Overflowの質問で、相互運用後もExcelプロセスが開いたままになる可能性のある答えがいくつか見つかりました。従来の方法が機能しない。問題はそれがPythonではないことであり、私はとを見つけられませMarshal.ReleaseComObjectGC。私は他のすべてのデモを見まし...site-packages/win32comた。

PIDを取得して殺すことができれば、それでも気になりません。

ウィンドウ名(win32)に基づくKillプロセスの回避策を見つけました。

適切な方法ではないかもしれませんが、回避策は次のとおりです。

def close_excel_by_force(excel):
    import win32process
    import win32gui
    import win32api
    import win32con

    # Get the window's process id's
    hwnd = excel.Hwnd
    t, p = win32process.GetWindowThreadProcessId(hwnd)
    # Ask window nicely to close
    win32gui.PostMessage(hwnd, win32con.WM_CLOSE, 0, 0)
    # Allow some time for app to close
    time.sleep(10)
    # If the application didn't close, force close
    try:
        handle = win32api.OpenProcess(win32con.PROCESS_TERMINATE, 0, p)
        if handle:
            win32api.TerminateProcess(handle, 0)
            win32api.CloseHandle(handle)
    except:
        pass

excel = DispatchEx('Excel.Application')
wbs = excel.Workbooks
wb = wbs.Open('D:\\Xaguar\\A1.xlsm')
wb.Close(False)
wbs.Close()
excel.Quit()
wb = None
wbs = None
close_excel_by_force(excel) # <--- YOU #@#$# DIEEEEE!! DIEEEE!!!
4

5 に答える 5

12

これを試して:

wbs.Close()
excel.Quit()
del excel # this line removed it from task manager in my case
于 2013-11-18T13:25:45.773 に答える
3

Excelを使用するファイルにこれがあります:

self.excel.Application.Quit()
于 2012-08-07T16:33:03.167 に答える
0

私は、win32com を介して Excel プロセスを強制終了することが常に信頼できるとは限らないことを気に入っています。これらには、上で示唆したようにexcel.Application.Quit()、およびが含まれます。del excel

プロセスが停止していることを確認する唯一の方法は、EXCEL.EXEプロセスを物理的に強制終了することです。

import psutil

def kill_excel():
    for proc in psutil.process_iter():
        if proc.name() == "EXCEL.EXE":
            proc.kill()

欠点は、このスクリプトが現在実行中のすべての Excel プロセスを明らかに強制終了することです。これに耐えられるなら、これは悪い選択肢ではありません。

于 2021-04-01T07:50:21.283 に答える