EXCEL应用程序窗口未在workbook.close()上关闭

时间:2019-05-08 16:56:23

标签: python excel xlwings

当我使用打开工作簿时

wbTest = xlwings.Book('test.xlsm')

EXCEL应用程序打开并显示工作簿。但是当做一个

wbTest.close()

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

EXCEL window still open

有没有办法在最后一个工作簿关闭时关闭EXCEL窗口?

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

4 个答案:

答案 0 :(得分:0)

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

wbTest.app.quit()

您可能想先保存工作簿,或者另存为app.kill()

答案 1 :(得分:0)

有时,已加载的工作簿包含使应用程序处于“未保存”状态的宏,即使尚未进行任何更改也是如此。在这种情况下,使用wbTest.app.quit()将提示一个保存对话框,我不想看到该对话框。使用wbTest.app.kill()将关闭工作簿(并关闭EXCEL窗口),但是在重新打开EXCEL时,将显示被杀死的wbTest工作簿的恢复对话框。

因此,这里是适用于我的整体解决方案:

import xlwings
import tempfile
import os

# ... some code creating at least one workbook "wbTest"

# check, if there is only one workbook left and we don't want to save it
if len(xlwings.apps) == 1:

    #save the remaining workbook into temporary folder
    wbTest.save(
        os.path.join(
            tempfile.gettempdir(),
            'test.xlsm',
        )
    )

    # close the application
    wbTest.app.quit()

感谢所有提示。

答案 2 :(得分:0)

与作者提供的建议解决方案一起,我发现有时当您在“个人宏工作簿”上有宏时,打开的工作簿的计数器也会发生变化。这就是为什么我添加了一个处理这种情况的简单函数的原因。

就我而言,有时我会打开多个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()

答案 3 :(得分:0)

我想分享一个解决方案,该解决方案可以帮助某些用户对原始问题稍作改动。在某些情况下,我打开了多个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()