gpt4 book ai didi

python win32com 关闭Excel进程

转载 作者:行者123 更新时间:2023-12-01 16:13:52 68 4
gpt4 key购买 nike

尝试通过 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.

我试过了删除 self.xlApp或者xlbook = 无在创建新的 XlsClass() 之前但似乎不起作用......

最佳答案

这可能是由于 python 的垃圾收集:每次循环时都会创建一个 XlsClass;当一次迭代结束时,XlsClass 的实例不再被引用,因此它可用于垃圾回收,但这可能不会立即发生。因此,下一次循环时,您会分派(dispatch)一个新的 Excel,但前一个 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__ 。在这种情况下,您必须在退出脚本之前通过执行最后的 GetActiveObject 来关闭 Excel(如果它已打开)。 (参见 Python/win32com - Check if Program is Open ),然后是 Close 。在我的 win32com 脚本中,我检查脚本启动时 Excel 是否已经在运行,如果是,我会打印一条错误,要求用户关闭,以防万一用户打开 Excel 书籍更容易让它们清理并退出,以便您从已知状态开始。

关于python win32com 关闭Excel进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22245698/

68 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com