Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can't close Excel completely using win32com on Python

Tags:

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!!! 
like image 384
sacabuche Avatar asked Apr 19 '12 03:04

sacabuche


People also ask

How to close Excel file using Python?

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.

What is Python win32com client?

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.


2 Answers

Try this:

wbs.Close() excel.Quit() del excel # this line removed it from task manager in my case 
like image 191
ROJI Avatar answered Oct 09 '22 00:10

ROJI


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.

like image 41
Robert Criqui Avatar answered Oct 08 '22 23:10

Robert Criqui