我无法在执行 xlwings 函数后关闭 Excel 2016

问题描述 投票:0回答:5

当我执行 Xlwings 函数时,我可以保存并关闭工作簿。但我无法再关闭 Excel 2016。 这是一个已知的问题?我该如何解决这个问题?

python excel xlwings
5个回答
12
投票

这是我如何让它工作的:

import xlwings as xw
wbPath = [WorkbookPath]
wb = xw.Book(wbPath) 
app = xw.apps.active    
wb.save(wbPath)
#wb.close()

app.quit()

请注意,我注释掉了

wb.close()
行。您可以跳过此步骤,而是设置 app = active Excel 实例,保存工作簿,然后退出应用程序。


2
投票

已更新

您可以在要关闭 Excel 和关联的工作簿时使用

wb.app.quit()
。假设
wb
是您的工作簿。请记住,如果您在
wb.app.quit()
之前使用
wb.close()
wb.app.quit()
将不起作用。这是一个例子:

import xlwings as xw

path = r"test.xlsx"
wb = xw.Book(path)
wb.app.quit()

但也可以考虑使用

with xw.App() as app
(自0.24.3版本开始)打开和关闭工作簿,我只能推荐它:

import xlwings as xw

with xw.App() as app:
    wb = xw.Book("test.xlsx")

    # Do some stuff e.g.
    wb.sheets[0]["A1"].value = 12345

    wb.save("test.xlsx")
    wb.close()

with
声明确保正确获取和释放资源。
with
语句可防止在正确关闭 Excel 之前发生错误时,Excel 保持打开状态并可能隐藏后台遗留的 excel 进程的问题(因为
xw.App(visible=False)
,如果使用的话)。
with
语句的另一个优点是您不再需要
app.quit()
了,因为 Excel 无论如何都会在 with 块的末尾关闭。但是 with 块末尾的
wb.close()
是可用的(但不是必需的)——它实现了下次打开 Excel 时,Excel 将不会显示 Excel 已恢复您可能想要保留的数据的消息(如所解释的 这里).


作为旁注,我遇到了

app.quit()
不起作用的情况。在这种情况下,我改用了
app.kill()


1
投票

我知道这是旧的,但我无法找到有效的答案并找到解决方案。我能够通过访问 xlwings 中的 api 属性来关闭 Excel 实例。

xl = xw.apps.active.api
xl.Quit()

xlwings 只是 pywin32 的精美包装器,您可以通过实现 api 属性直接访问 pywin32 函数。


1
投票

基于 mouwsy 的回答,我现在有了这个上下文管理器:

class XwApp(xw.App):
    def __enter__(self, *args, **kwargs):
        return super(*args, **kwargs)
    def __exit__(self, *args):
        for book in self.books:
            try:
                book.close()
            except: pass
        self.kill()

我这样使用:

with XwApp(visible=False) as app:
    app.books.add()
    
    # or
    
    app.books.open('file.xlsx')
    
    # ...

到目前为止,这似乎相当干净。 (但是预先打开的 Excel 窗口总是会把事情搞砸。)


0
投票

如下可能。 我评论关闭您之前打开或创建的工作簿。

import xlwings as xw
wb = xw.Book()

wb.close()
xw.App().quit()
© www.soinside.com 2019 - 2024. All rights reserved.