【发布时间】:2020-07-15 06:27:52
【问题描述】:
我有一个 Excel 文件,其中包含查询表。我希望python刷新并保存它。 做了一些研究,虽然我找到了perfect solution!
import win32com.client
# Start an instance of Excel
xlapp = win32com.client.DispatchEx("Excel.Application")
# Open the workbook in said instance of Excel
wb = xlapp.workbooks.open(r'C:\Users\User Name\Company\Management - Documents\Technical\Daily Data.xlsx')
# Optional, e.g. if you want to debug
xlapp.Visible = True
# Refresh all data connections.
wb.RefreshAll()
xlapp.CalculateUntilAsyncQueriesDone()
wb.Save()
# Quit
xlapp.Quit()
当我运行此代码时,它说文件已在另一个应用程序中打开。 我有办公室 365。我错过了什么?我也试过XlWings的方法,报错了!
【问题讨论】:
-
您的代码使用通用 Excel 文件运行良好。有时使用 Office365,您可能会遇到另一个用户在文件中的问题(如果它是共享的),在这种情况下它可以被锁定以进行编辑,或者 Excel 仍在后台运行。我要尝试的第一件事就是完全退出 Excel,然后重新启动计算机,这应该会终止任何可能导致错误的后台 Excel 进程。
-
我就是这么做的,而且效果很好。我以为它一开始就挂了,但实际上一旦我关闭窗口,就会出现一个消息框,说该文件已在另一个应用程序中打开。重启解决了这个问题。然后,如果文件中有其他人,它会提示我按下按钮进行保存 - 通过关闭警报来解决此问题
-
唯一可能出现的问题是文件是否在运行脚本的计算机上打开。然后我可能会再次遇到第一个错误。目前不确定如何解决。
-
最好的解决方案可能是在您不必担心文件被打开的环境(如 Docker)中运行脚本。但是,根据您的用例,如果它不经常出现,那么像刚才那样解决错误可能会更容易。我的猜测(如果我错了,请纠正我)是错误源于“幻像”Excel 进程,而不是文件实际打开。假设是这种情况,您不能只运行一个命令来关闭文件,并且您可能会通过杀死所有 Excel 进程来强制退出来破坏其他工作簿。
-
我建议将整个代码包装在 Try/Except 中,并将
xlapp.Quit()放在 except 行中。如果您有任何错误,您将在后台堆叠虚拟 Excel 应用程序。无论发生什么,这都会关闭 Excel。