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

axr492tv  于 2023-02-20  发布在  其他
关注(0)|答案(4)|浏览(684)

当我执行Xlwings函数时,我可以保存并关闭工作簿。但我无法再关闭Excel 2016。这是已知问题吗?如何修复此问题?

w8f9ii69

w8f9ii691#

下面是我如何让它工作的:

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示例,保存工作簿,然后退出应用程序。

bprjcwpo

bprjcwpo2#

更新

当您要关闭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()代替。

093gszye

093gszye3#

在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窗口总是会把事情搞砸。)

nuypyhwy

nuypyhwy4#

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

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

xlwings只是pywin32的一个花哨的 Package 器,你可以通过实现API属性直接访问pywin32的函数。

相关问题