无法在 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 process remains open after interop;传统方法行不通_。问题是它不是 Python,我没有找到 Marshal.ReleaseComObjectGC 。我查看了 ...site-packages/win32com 和其他网站上的所有演示。

如果我能得到 PID 并杀死它,即使它不会打扰我。

我在 Kill process based on window name (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!!!

原文由 sacabuche 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 950
1 个回答

尝试这个:

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

原文由 ROJI 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题