[英]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.