Đâ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.ReleaseComObject
và GC
. 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!!!
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
:/không hoạt động, là một excel đau thực sự và COM – sacabuche
Tôi tìm cách nhưng không sử dụng COM – sacabuche