and python excel com pywin32 win32com

python and excel integration



No se puede cerrar Excel completamente usando win32com en Python (2)

Este es mi código, y encontré muchas respuestas para VBA , .NET framework y es bastante extraño. Cuando ejecuto esto, Excel se cierra.

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

Pero cuando hago lo siguiente, no se cierra.

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

Encontré alguna respuesta posible en la pregunta sobre desbordamiento de pila. El proceso de Excel permanece abierto después de la interoperabilidad; método tradicional no funciona . El problema es que no es Python, y no encuentro Marshal.ReleaseComObject y GC . Revisé todas las demos en ...site-packages/win32com y otros.

Incluso no me molesta si consigo el PID y matarlo.

Encontré una solución en el proceso de Kill basado en el nombre de la ventana (win32) .

Puede que no sea la forma correcta, pero un workround es:

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


Tengo esto en mis archivos que usan Excel:

self.excel.Application.Quit()


Prueba esto:

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