当我执行 Xlwings 函数时,我可以保存并关闭工作簿。但我无法再关闭 Excel 2016。 这是一个已知的问题?我该如何解决这个问题?
这是我如何让它工作的:
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 实例,保存工作簿,然后退出应用程序。
已更新
您可以在要关闭 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()
。
我知道这是旧的,但我无法找到有效的答案并找到解决方案。我能够通过访问 xlwings 中的 api 属性来关闭 Excel 实例。
xl = xw.apps.active.api
xl.Quit()
xlwings 只是 pywin32 的精美包装器,您可以通过实现 api 属性直接访问 pywin32 函数。
基于 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 窗口总是会把事情搞砸。)
如下可能。 我评论关闭您之前打开或创建的工作簿。
import xlwings as xw
wb = xw.Book()
wb.close()
xw.App().quit()