【发布时间】:2017-04-15 02:25:45
【问题描述】:
我有一个运行 Python 脚本的 Excel 文件。 Excel 文件具有运行 Python 脚本之前需要刷新的外部数据连接。我指的功能在这里:
我正在使用 Python 2.7,并且依赖 Pandas 进行大部分 Excel 数据解析。
【问题讨论】:
-
你的问题是?我只能猜测它是“你能从 python 刷新数据连接吗”,但它在你的帖子中丢失了。
我有一个运行 Python 脚本的 Excel 文件。 Excel 文件具有运行 Python 脚本之前需要刷新的外部数据连接。我指的功能在这里:
我正在使用 Python 2.7,并且依赖 Pandas 进行大部分 Excel 数据解析。
【问题讨论】:
CalculateUntilAsyncQueriesDone() 将暂停程序并等待刷新完成。
xlapp = win32com.client.DispatchEx("Excel.Application")
wb = xlapp.Workbooks.Open(<path_to_excel_workbook>)
wb.RefreshAll()
xlapp.CalculateUntilAsyncQueriesDone()
wb.Save()
xlapp.Quit()
【讨论】:
如果您使用的是 Windows,并且我相信您已获得屏幕截图,则可以使用 win32com 模块。它将允许您 - 从 python - 打开 Excel、加载工作簿、刷新所有数据连接然后退出。语法最终非常接近 VBA。
我建议你通过 pip (pip install pypiwin32) 安装pypiwin32。
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(<path_to_excel_workbook>)
# Optional, e.g. if you want to debug
# xlapp.Visible = True
# Refresh all data connections.
wb.RefreshAll()
wb.Save()
# Quit
xlapp.Quit()
【讨论】:
xlapp.Quit() 之前尝试睡一会。多长时间取决于刷新运行需要多长时间。
添加此作为答案,因为这是第一个 Google 链接 - 第一个答案中的代码有效,但大小写不正确,应该是:
import win32com.client
import time
xlapp = win32com.client.DispatchEx("Excel.Application")
wb = xlapp.Workbooks.Open(<path_to_excel_workbook>)
wb.RefreshAll()
time.sleep(5)
wb.Save()
xlapp.Quit()
【讨论】:
RefreshAll 是否在刷新实际完成之前返回?
除了其他人所说的之外,当代码到达 Quit 行时,我不断地再次获得保存对话框。我将 DisplayAlerts 标志设置为 false,它解决了我的问题。我也不需要睡眠定时器。这对我有用:
xlapp = win32com.client.DispatchEx("Excel.Application")
wb = xlapp.Workbooks.Open(<path_to_excel_workbook>)
wb.RefreshAll()
xlapp.CalculateUntilAsyncQueriesDone()
xlapp.DisplayAlerts = False
wb.Save()
xlapp.Quit()
【讨论】:
一个小笔记,但很重要。以上所有代码都是正确的,但它会引发权限 Err 13 的问题,因为文件只是被保存,而不是关闭。
保存后添加wb.Close(),否则打开的Excel会保留在后台应用程序中,如果你使用其中的500个,你可能会有点麻烦
【讨论】: