web-dev-qa-db-ja.com

Python)でwin32comを使用してExcelを完全に閉じることはできません

これは私のコードであり、 [〜#〜] vba [〜#〜] 、. NETフレームワークに対する多くの答えを見つけました。これはかなり奇妙です。これを実行すると、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)に基づいてプロセスを強制終了するで回避策を見つけました。

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

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!!!
21
sacabuche

これを試して:

wbs.Close()
Excel.Quit()
del Excel # this line removed it from task manager in my case
9
ROJI

私はExcelを使用する私のファイルにこれを持っています:

self.Excel.Application.Quit()
2
Aaron S