Nie można całkowicie zamknąć programu Excel przy użyciu win32com w Pythonie
To jest mój kod i znalazłem wiele odpowiedziVBA, .NET Framework i jest dość dziwny. Kiedy to wykonam, Excel zamyka się.
<code>from win32com.client import DispatchEx excel = DispatchEx('Excel.Application') wbs = excel.Workbooks wbs.Close() excel.Quit() wbs = None excel = None # <-- Excel Closes here </code>
Ale kiedy wykonuję następujące czynności, nie zamyka się.
<code>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 !!! </code>
Znalazłem możliwą odpowiedź w pytaniu Przepełnienie stosuProces Excel pozostaje otwarty po interopie; metoda tradycyjna nie działa. Problem polega na tym, że nie jest to Python i nie znajdujęMarshal.ReleaseComObject
iGC
. Przejrzałem wszystkie prezentacje...site-packages/win32com
i inni.
Nawet to mi nie przeszkadza, jeśli mogę po prostu zdobyć PID i zabić go.
Znalazłem obejście wZabij proces na podstawie nazwy okna (win32).
Może nie jest to właściwy sposób, ale praca to:
<code>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!!! </code>