2012-04-19 333 views
15

这是我的代码,我发现很多的答案为VBA,.NET框架,是非常奇怪的。当我执行这个时,Excel关闭。不能关闭Excel完全使用win32com Python的

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

我发现堆栈溢出问题Excel process remains open after interop; traditional method not working一些可能的答案。问题是,是不是Python的,而且我不觉得Marshal.ReleaseComObjectGC。我查看了...site-packages/win32com等人的所有演示。

即使它不打扰我,如果我可以只得到PID和杀死它。

我在Kill process based on window name (win32)找到了解决方法。

可能是不正确的方法,但workround是:

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

尝试添加行'excel.DisplayAlerts = FALSE'调用'wbs.Open(...)'之前,看看有没有什么帮助。 – srgerg 2012-04-19 03:41:01

+0

:/无法正常工作,是一个真正的痛苦Excel和COM – sacabuche 2012-04-19 03:52:01

+0

我找到路,但没有使用COM – sacabuche 2012-04-19 05:39:24

回答

1

我有这个在我的文件使用Excel:

self.excel.Application.Quit() 
+0

和您使用DispatchEx或Dispatch,它真的关闭或继续运行?因为事实上,当我关闭它似乎被关闭,但它让活着的时候,我看到任务管理器 – sacabuche 2012-08-08 17:42:59

+0

哎呀很抱歉。我正在使用EnsureDispatch,这可能会有所不同。之后它完全关闭。 – 2012-08-08 18:54:09

6

试试这个:

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

del excel不会从任务管理器中删除Excel进程 – Eildosa 2015-05-26 14:16:56

+0

尝试将wbs.Close()更改为wbs.Close(False)以在不保存的情况下关闭工作簿。 – 2017-03-31 16:30:03