2012-04-19 32 views
15

Đây là mã của tôi và tôi đã tìm thấy nhiều câu trả lời cho VBA, .NET framework và khá lạ. Khi tôi thực hiện điều này, Excel sẽ đóng lại.Không thể đóng Excel hoàn toàn bằng win32com trên Python

from win32com.client import DispatchEx 
excel = DispatchEx('Excel.Application') 
wbs = excel.Workbooks 
wbs.Close() 
excel.Quit() 
wbs = None 
excel = None # <-- Excel Closes here 

Nhưng khi tôi làm như sau, nó không đóng.

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 !!! 

Tôi tìm thấy một số câu trả lời có thể trong Stack Overflow câu hỏi Excel process remains open after interop; traditional method not working. Vấn đề là không phải là Python, và tôi không tìm thấy Marshal.ReleaseComObjectGC. Tôi đã xem qua tất cả các bản trình diễn trên ...site-packages/win32com và các bản trình diễn khác.

Thậm chí nó không làm phiền tôi nếu tôi chỉ có thể nhận được PID và giết nó.

Tôi đã tìm thấy giải pháp thay thế trong Kill process based on window name (win32).

Có thể không phải là cách đúng đắn, nhưng một workround là:

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

Hãy thử thêm dòng 'excel.DisplayAlerts = False' trước cuộc gọi đến' wbs.Open (...) 'và xem điều đó có giúp ích gì không. – srgerg

+0

:/không hoạt động, là một excel đau thực sự và COM – sacabuche

+0

Tôi tìm cách nhưng không sử dụng COM – sacabuche

Trả lời

1

Tôi có điều này trong tác phẩm của tôi có sử dụng Excel:

self.excel.Application.Quit() 
+0

và bạn có đang sử dụng DispatchEx không , hoặc Công văn, và nó thực sự đóng hoặc tiếp tục chạy? bởi vì trong thực tế khi tôi đóng nó có vẻ như đã đóng cửa, nhưng nó vẫn còn sống khi tôi thấy người quản lý công việc – sacabuche

+0

Rất tiếc vì điều đó. Tôi đang sử dụng EnsureDispatch mà có thể tạo sự khác biệt. Nó hoàn toàn bị đóng lại sau đó. –

6

Hãy thử điều này:

wbs.Close() 
excel.Quit() 
del excel # this line removed it from task manager in my case 
+0

del excel không xóa quy trình Excel khỏi trình quản lý tác vụ – Eildosa

+0

Thử thay đổi wbs.Close() thành wbs.Close (False) để đóng sổ làm việc mà không lưu. –