簡體   English   中英

python win32com關閉Excel進程

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM