[英]python win32com close Excel process
试图通过python改变Excel_sheet并在进程恢复中完全混淆。
import win32com.client
class XlsClass:
def __init__(self ,filename=None ,*,Visible=False ,Alerts=False):
self.xlApp = win32com.client.Dispatch('Excel.Application')
self.xlApp.Visible = Visible
self.xlApp.DisplayAlerts = Alerts
if filename:
self.filename = filename
self.xlBook = self.xlApp.Workbooks.Open(filename)
else:
self.xlBook = self.xlApp.Workbooks.Add()
self.filename = ''
def __del__(self):
self.xlBook.Close()
self.xlApp.Quit()
有时代码运行良好,但有时python会引发错误,就像'self.xlApp.Visible无法设置?'。 这总是发生在循环中,如:
for fname in filelist:
xlbook = XlsClass(fname)
#do something
然后我检查了我的'windowstasksmanager'并注意到了
xlbook = Dispatch('Excel.Application')
将创建一个名为'EXCEL.EXE * 32'的进程。 当我输入'xlbook.Quit()'
,过程仍然存在!? 因此,这个剩余过程可能是'不能设置'错误? 在我调用函数'Dispatch'后,我怎么能完全关闭它?
del xlbook
不能杀死这个过程,它是如何工作的?
英语不好,等待帮助....谢谢。
2014/3/10:我再次发现错误并捕捉回溯......
Traceback (most recent call last):
File "C:\work_daily\work_RecPy\__RecLib\XlsClass.py", line 9, in __init__
self.xlApp.Visible = Visible
File "C:\Program Files\python33\lib\site-packages\win32com\client\dynamic.py",
line 576, in __setattr__
raise AttributeError("Property '%s.%s' can not be set." % (self._username_,attr))
AttributeError: Property 'Excel.Application.Visible' can not be set.
我在创建新的XlsClass()之前尝试了del self.xlApp
或xlbook = None
但似乎没有工作......
这可能是由于python的垃圾收集:每次循环都会创建一个XlsClass; 当一次迭代结束时,不再引用XlsClass的实例,因此它可用于垃圾收集,但这可能不会立即发生。 所以下次循环你会发送一个新的Excel,但前一个可能还没有完全关闭。 尝试在下一次迭代之前强制执行垃圾收集:
for fname in filelist:
xlbook = XlsClass(fname)
#do something
xlbook = None
gc.collect()
更新:
如果这不起作用,您可以尝试附加到正在运行的实例,即一旦调度,不要关闭应用程序,只需关闭工作簿。 在这种情况下,你可能想要做这样的事情:
class XlsClass:
def __init__(self, xlApp, filename=None ,*,Visible=False ,Alerts=False):
self.xlApp = xlApp
self.xlApp.Visible = Visible
...
def otherMethod(self):
# ....
def close(self):
self.xlBook.Close()
self.xlBook = None
self.xlApp = None
# don't do anything with self.xlApp or self
xlApp = win32com.client.Dispatch('Excel.Application')
for fname in filelist:
xlbook = XlsClass(xlApp, fname)
# do something with xlbook
xlbook.close()
请注意,显式关闭本书比等待垃圾收集器执行__del__
更好。
此外,您可以使用win32com.client.GetObject (filename)
,如果存在,将获取现有实例,如果不存在则自动创建一个; 你可以把GetObject
放在__init__
。 在这种情况下,你将不得不关闭Excel, 如果它被打开了 ,退出你的脚本之前,做最后的GetActiveObject
(见的Python / win32com -检查计划是开放 ),然后Close
。 在我的win32com脚本中,我检查脚本启动时Excel是否已经运行,如果是这样,我打印一个错误,要求用户关闭,以防万一用户打开Excel书籍更容易让他们清理并退出以便从已知状态开始。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.