这是我的代码,我发现很多的答案为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.ReleaseComObject
和GC
。我查看了...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!!!
尝试添加行'excel.DisplayAlerts = FALSE'调用'wbs.Open(...)'之前,看看有没有什么帮助。 – srgerg 2012-04-19 03:41:01
:/无法正常工作,是一个真正的痛苦Excel和COM – sacabuche 2012-04-19 03:52:01
我找到路,但没有使用COM – sacabuche 2012-04-19 05:39:24