这是我的代码,我找到了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; traditional method not working 中找到了一些可能的答案。问题是不是Python,我找不到Marshal.ReleaseComObject
和GC
。我查看了...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!!!
答案 0 :(得分:7)
试试这个:
wbs.Close()
excel.Quit()
del excel # this line removed it from task manager in my case
答案 1 :(得分:1)
我在使用Excel的文件中有这个:
self.excel.Application.Quit()
答案 2 :(得分:0)
对我有用的是确保取消引用您按照以下方式分配的所有变量:
[PXDimensionSelector(AccountAttribute.DimensionName,
typeof(Search5<Account.accountID>...
它可以使用任何一种Dispatch格式。
答案 3 :(得分:0)
Python应该处理COM对象的生命周期。只需设置excel = None
。请参阅此作为参考:
# CH9 says: Python manages COM lifetimes automatically for you; when your excel
# variable is no longer used, Excel automatically closes. In Python,
# the simplest way to remove this variable is to assign it to another
# value. If you use the following code, notice that Excel vanishes
# from the screen; it knows there are no longer any programs referring to it.
src:
http://www.icodeguru.com/WebServer/Python-Programming-on-Win32/ch05.htm#:~:text=xl%20=%20None
答案 4 :(得分:0)
我喜欢通过 win32com 杀死 Excel 进程并不总是那么可靠。这些包括 excel.Application.Quit()
和 del excel
,如上面建议的那样。
我发现确保它已死的唯一方法是物理终止 EXCEL.EXE
进程:
import psutil
def kill_excel():
for proc in psutil.process_iter():
if proc.name() == "EXCEL.EXE":
proc.kill()
缺点是这个脚本显然会杀死当前正在运行的所有 excel 进程。如果你能忍受这个,那么这不是一个糟糕的选择。