Python 工作簿上的EXCEL应用程序窗口未关闭。关闭()

Python 工作簿上的EXCEL应用程序窗口未关闭。关闭(),python,excel,xlwings,Python,Excel,Xlwings,当我使用打开工作簿时 wbTest=xlwings.Book('test.xlsm')) EXCEL应用程序打开并显示工作簿。但是当你做一个 wbTest.close() 之后,工作簿关闭,但EXCEL窗口保持打开状态,因此我必须手动关闭它,即使xlwings.apps返回空列表: 是否有办法在最后一个工作簿关闭时立即关闭EXCEL窗口? 在官方文档(readthedocs)中,到目前为止,我找不到任何解决此问题的方法。在Windows上,xlwings目前需要一个工作簿才能与Excel进

当我使用打开工作簿时

wbTest=xlwings.Book('test.xlsm'))
EXCEL应用程序打开并显示工作簿。但是当你做一个

wbTest.close()
之后,工作簿关闭,但EXCEL窗口保持打开状态,因此我必须手动关闭它,即使
xlwings.apps
返回空列表:

是否有办法在最后一个工作簿关闭时立即关闭EXCEL窗口?


在官方文档(readthedocs)中,到目前为止,我找不到任何解决此问题的方法。

在Windows上,xlwings目前需要一个工作簿才能与Excel进行通信。但是你可以通过退出应用程序而不是仅仅关闭工作簿来实现你想要的目标(你可以首先通过
len(wbTest.app.books)
检查该应用程序中是否有多个打开的工作簿):


您可能希望先保存工作簿,或者也可以使用
app.kill()

有时,加载的工作簿包含宏,即使尚未进行任何更改,也会使应用程序处于“未保存”状态。在本例中,使用
wbTest.app.quit()
,将提示一个我不想看到的保存对话框。使用
wbTest.app.kill()
将关闭工作簿(并关闭EXCEL窗口),但在重新打开EXCEL时,将显示已删除的wbTest工作簿的恢复对话框,这是我希望避免的

因此,以下是对我有效的总体解决方案:

导入xlwings
导入临时文件
导入操作系统
# ... 某些代码正在创建至少一个工作簿“wbTest”
#检查是否只剩下一个工作簿,并且我们不想保存它
如果len(xlwings.apps)==1:
#将剩余工作簿保存到临时文件夹中
wbTest.save(
os.path.join(
tempfile.gettempdir(),
“test.xlsm”,
)
)
#关闭应用程序
wbTest.app.quit()

感谢所有提示。

根据作者提出的解决方案,我发现有时当个人宏工作簿上有宏时,打开工作簿的计数器会发生变化。这就是为什么我添加了一个简单的函数来处理这种情况

在我的例子中,有时我会打开多个excel文件,这对于清除受宏影响但您不希望被关闭的工作簿非常方便

def quit_excel(wb):
    """wb: workbook object from xlwings"""

    print(wb.app.books)  # for debugging and visualization of opened workbooks

    # look if PERSONAL.XLSB is in the list of books associated with the Excel App
    if "PERSONAL.XLSB" in [b.name for b in wb.app.books]:

        if len(wb.app.books) == 2: 
            print("personal, 2, quitting")
            wb.app.quit()

        else:
            print("personal, closing")
            wb.close()

    else:


        if len(wb.app.books) == 1: 
            print("no personal, 1, quitting")
            wb.app.quit()

        else:
            print("no personal, closing")
            wb.close()


我想分享一个解决方案,它可以帮助一些用户对原始问题稍加修改。在某些情况下,我打开了多个excel工作簿,因此在运行代码之前,我只想关闭脚本打开的工作簿,而不是整个excel应用程序。下面是我的解决方案,它将适用于此场景

wb = xw.Book(file_path)
excel_app = xw.apps.active

#
# do stuff with workbook
#

# close workbook if more then one workbook is open. 
# you won't get empty grey excel app since you have another workbook open.
if xw.apps.count > 1:
     wb.close()
# close excel application if only one workbook is open
else:
     excel_app.quit()

我不知道它是否在xlwings中工作,但我已经成功运行:
del excel
使用win32com和OpenPyxl这将是我下一个要检查的替代方案。谢谢@VinkThanks@FelixZumstein。我把你的建议写进了最后的答案中。
wb = xw.Book(file_path)
excel_app = xw.apps.active

#
# do stuff with workbook
#

# close workbook if more then one workbook is open. 
# you won't get empty grey excel app since you have another workbook open.
if xw.apps.count > 1:
     wb.close()
# close excel application if only one workbook is open
else:
     excel_app.quit()