2012-04-19 44 views
15

Este es mi código, y encontré muchas respuestas para VBA, .NET framework y es bastante extraño. Cuando ejecuto esto, Excel se cierra.No puedo cerrar Excel completamente usando win32com en Python

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

me encontré con alguna posible respuesta en cuestión de desbordamiento de pila Excel process remains open after interop; traditional method not working. El problema es que no es Python, y no encuentro Marshal.ReleaseComObject y GC. Revisé todas las demostraciones en ...site-packages/win32com y otras.

Ni siquiera me molesta si consigo el PID y matarlo.

Encontré una solución en Kill process based on window name (win32).

puede no ser 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!!! 
+0

Try agregando la línea 'excel.DisplayAlerts = False' antes de la llamada a' wbs.Open (...) 'y ver si eso ayuda. – srgerg

+0

:/no funciona, es un verdadero dolor sobresalir y COM – sacabuche

+0

encuentro el camino pero no uso COM – sacabuche

Respuesta

1

tengo esto en mis archivos que utilizan Excel:

self.excel.Application.Quit() 
+0

y está utilizando DispatchEx , o Despacho, y realmente se cierra o sigue funcionando? porque de hecho, cuando lo cierro parece estar cerrado, pero se mantiene activo cuando veo el administrador de tareas – sacabuche

+0

Vaya, disculpa. Estoy usando EnsureDispatch, que podría marcar la diferencia. Está totalmente cerrado después. –

6

Prueba esto:

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

del excel no elimina el proceso de Excel del administrador de tareas – Eildosa

+0

Intente cambiar wbs.Close() a wbs.Close (False) para cerrar el libro de trabajo sin guardarlo. –

Cuestiones relacionadas