This is my code, and I found many answers for VBA, .NET framework and is pretty strange. When I execute this, Excel closes.
from win32com.client import DispatchEx excel = DispatchEx('Excel.Application') wbs = excel.Workbooks wbs.Close() excel.Quit() wbs = None excel = None # <-- Excel Closes here
But when I do the following, it does not close.
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 !!!
I found some possible answer in Stack Overflow question Excel process remains open after interop; traditional method not working. The problem is that is not Python, and I don't find Marshal.ReleaseComObject
and GC
. I looked over all the demos on ...site-packages/win32com
and others.
Even it does not bother me if I can just get the PID and kill it.
I found a workaround in Kill process based on window name (win32).
May be not the proper way, but a workround is:
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!!!
Closing a file in Python Python has a close() method to close a file. The close() method can be called more than once and if any operation is performed on a closed file it raises a ValueError.
There are several APIs available to convert text to speech in python. One of such APIs available in the python library commonly known as win32com library. It provides a bunch of methods to get excited about and one of them is the Dispatch method of the library. Dispatch method when passed with the argument of SAPI.
Try this:
wbs.Close() excel.Quit() del excel # this line removed it from task manager in my case
What worked for me was making sure to de-reference any variables that you assigned along the way like so:
import win32com.client as win32 fileDirectory = 'Hello World.xlsx' #excelFile = win32.Dispatch('Excel.Application') excelFile = win32.gencache.EnsureDispatch('Excel.Application') excelFile.Visible = True excelFile.DisplayAlerts = True wb = excelFile.Workbooks.Open(fileDirectory) ws = wb.Sheets("Sell") ws.Range("D1").Value = "Hello World!" ws = None wb.Close(False) wb = None excelFile.Quit() excelFile = None
It worked with either Dispatch format.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With