python中操作Excel时,只干掉当前Excel的进程?

python操作Excel时,只干掉当前Excel的进程?该怎么弄?有时用 DispatchEx打开时用workbook .Close(SaveChanges=0) # 关闭工作薄,不保存
excel.Quit() # 退出excel 发现进程没有关闭,如何只关闭当前excel进程?

我照着你说的那样open然后close再quit是可以退出的,实际只用close就可以退出
可能你的程序用有些特别的处理

可以使用下面的方法,调用close_excel_by_force(excel)

def close_excel_by_force(excel):
    import time
    import win32process
    import win32gui
    import win32api
    import win32con

    hwnd = excel.Hwnd
    t, p = win32process.GetWindowThreadProcessId(hwnd)  
    win32gui.PostMessage(hwnd, win32con.WM_CLOSE, 0, 0)  
    time.sleep(10)
    try:
        handle = win32api.OpenProcess(win32con.PROCESS_TERMINATE, 0, p)
        if handle:
            win32api.TerminateProcess(handle, 0)
            win32api.CloseHandle(handle)
    except:
        pass

https://stackoverflow.com/questions/10221150/cant-close-excel-completely-using-win32com-on-python

https://blog.csdn.net/weixin_30672019/article/details/94923698

缘由:
脚本都是用来解决实际问题的,我最近碰到的问题是这样的(很罗嗦,只关心代码的请建议直接跳过)。天敏电视卡提供了定时录像的功能,这个功能可以定时开机,录像完成后自动关机,照理说功能也已经够用,但录像结束后没有关闭应用这个功能。有时我录像完成后并不需要关闭电脑(比如说正在bt下载电影),这时前台的电视窗口就一直开着,喇叭里面还不停播放电视对白,非常地不必要。于是想写一个python脚本,定时在每天录像以后执行,用来关闭电视卡应用程序。

网上搜了一下,找到相关的介绍。
一开始的思路是,根据exe文件找到进程id(类似在任务管理器里面查找),然后中止进程,
最漂亮的方法是用WMI对象找到指定进程(见reference 1)。随后发现,更加体面的中止应用的方法是找到应用程序的窗口,发送WM_CLOSE消息,如果失败(比如提示用户保存文件等待用户操作),再用TerminateProcess结束进程,其中要注意,TerminateProcess接受的参数是句柄,而不是进程号。

以下的代码是用来结束“记事本”这个应用的,
1.       根据窗口的标题找到窗口句柄(EnumWindows,注意,需要用可恶的回调函数,见windowEnumerationHandler),比如“未标题 – 记事本”,字符串匹配末尾的“记事本”可以找到
2.       向窗口发送WM_CLOSE消息(PostMessage),等待10秒
3.       根据窗口获得进程id(GetWindowThreadProcessId),试图强行中止进程(如果窗口收到WM_CLOSE消息已经关闭,亦无害)

附代码killwindow.py

#coding=cp936

import win32api
import win32con
import win32gui
import win32process
import time

#We are going to use the win32gui.EnumWindows() function to get our top level window information. This is one of those nasty functions which wants a callback function passed to it (consult the docs if you are really bored). So here's one I made earlier:

def windowEnumerationHandler(hwnd, resultList):

    '''Pass to win32gui.EnumWindows() to generate list of window handle, window text tuples.'''

    resultList.append((hwnd, win32gui.GetWindowText(hwnd)))

def killwindow(hwnd):
    threadId, processId = win32process.GetWindowThreadProcessId(hwnd)
    print 'processId = ', processId
    # Ask window nicely to close
    win32gui.PostMessage(hwnd, win32con.WM_CLOSE, 0, 0)
    # Allow some time for app to close
    time.sleep(10)
    # If app didn't close, force close
    try:
        handle = win32api.OpenProcess(win32con.PROCESS_TERMINATE, 0, processId)
        if handle:
            print 'handle = ', handle
            win32api.TerminateProcess(handle,0)
            win32api.CloseHandle(handle)
    except Exception, e:
        print e
        pass

#We can pass this, along a list to hold the results, into win32gui.EnumWindows(), as so:

topWindows = []

win32gui.EnumWindows(windowEnumerationHandler, topWindows)

for i in topWindows:
    if i[1].endswith('记事本'):
        print i[0], i[1]
        killwindow(i[0])