To jest mój kod i znalazłem wiele odpowiedzi dla VBA, platformy .NET i jest dość dziwne. Kiedy to zrobię, Excel się zamknie.Nie można całkowicie zamknąć programu Excel przy użyciu Win32com na Pythonie
from win32com.client import DispatchEx
excel = DispatchEx('Excel.Application')
wbs = excel.Workbooks
wbs.Close()
excel.Quit()
wbs = None
excel = None # <-- Excel Closes here
Ale kiedy robię co następuje, to się nie zamyka.
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 !!!
znalazłem kilka możliwych odpowiedzi w przepełnienie stosu pytanie Excel process remains open after interop; traditional method not working. Problem polega na tym, że nie jest to Python i nie znajduję Marshal.ReleaseComObject
i GC
. Przejrzałem wszystkie dema na ...site-packages/win32com
i innych.
Nawet mnie to nie przeszkadza, jeśli mogę po prostu uzyskać PID i zabić go.
Znalazłem obejście w Kill process based on window name (win32).
może nie być właściwym sposobem, ale workround jest:
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!!!
Try dodanie linii 'excel.DisplayAlerts = False' przed wywołaniem' wbs.Open (...) 'i zobacz, czy to pomaga. – srgerg
:/nie działa, to prawdziwy ból excel i COM – sacabuche
Znajduję sposób, ale nie używając COM – sacabuche