【问题标题】:Refreshing Excel Queries with Python - win32com not working使用 Python 刷新 Excel 查询 - win32com 不起作用
【发布时间】: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。

标签: python excel win32com


【解决方案1】:

您需要关闭 wb 然后在wb.Save() 之后添加wb.Close()

【讨论】:

    【解决方案2】:

    我遇到了这个问题,因为缓存 excel 文件仍在后端打开,您可以在任务管理器中将其杀死,但我的解决方法是将其添加到代码末尾

    xlapp=none

    【讨论】:

      猜你喜欢
      • 2022-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-15
      • 2022-06-17
      • 2021-04-30
      • 2015-10-19
      • 1970-01-01
      相关资源
      最近更新 更多