【问题标题】:Refresh Excel External Data with Python使用 Python 刷新 Excel 外部数据
【发布时间】:2017-04-15 02:25:45
【问题描述】:

我有一个运行 Python 脚本的 Excel 文件。 Excel 文件具有运行 Python 脚本之前需要刷新的外部数据连接。我指的功能在这里:

我正在使用 Python 2.7,并且依赖 Pandas 进行大部分 Excel 数据解析。

【问题讨论】:

  • 你的问题是?我只能猜测它是“你能从 python 刷新数据连接吗”,但它在你的帖子中丢失了。

标签: python excel pandas


【解决方案1】:

CalculateUntilAsyncQueriesDone() 将暂停程序并等待刷新完成。

xlapp = win32com.client.DispatchEx("Excel.Application")
wb = xlapp.Workbooks.Open(<path_to_excel_workbook>)
wb.RefreshAll()
xlapp.CalculateUntilAsyncQueriesDone()
wb.Save()
xlapp.Quit()

【讨论】:

    【解决方案2】:

    如果您使用的是 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()
    

    【讨论】:

    • 感谢您的建议 - 我之前尝试过这种方法,但不幸的是我收到“这将取消挂起的数据刷新。继续吗?”对话框,没有任何反应。
    • 您是否尝试过从 excel 完成数据刷新,然后重新启动计算机?这应该工作
    • 在致电xlapp.Quit() 之前尝试睡一会。多长时间取决于刷新运行需要多长时间。
    • @cco,这正是我遇到的问题。 time.sleep(5) 防止了错误。人们会期望它在继续之前完成刷新。
    • 在内部,Excel 可以在多个处理器上使用多个线程。如果您有一个复杂的电子表格,它甚至会在重新计算时显示正在使用的处理器数量。 IIRC,可以同步刷新单个数据库连接,但我会假设(并且看起来)`RefreshAll()' 异步运行,因此 API 调用将在刷新完成之前返回。如果电子表格仅用于输入,您可以考虑从 Python 运行查询,因为它可以与 Excel 可以访问的任何数据库进行对话。
    【解决方案3】:

    添加此作为答案,因为这是第一个 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()
    

    【讨论】:

    • 真的需要等待 5 秒吗? RefreshAll 是否在刷新实际完成之前返回?
    【解决方案4】:

    除了其他人所说的之外,当代码到达 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()
    

    【讨论】:

      【解决方案5】:

      一个小笔记,但很重要。以上所有代码都是正确的,但它会引发权限 Err 13 的问题,因为文件只是被保存,而不是关闭。

      保存后添加wb.Close(),否则打开的Excel会保留在后台应用程序中,如果你使用其中的500个,你可能会有点麻烦

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-12-05
        • 2013-12-19
        • 2016-01-11
        • 2020-03-11
        • 1970-01-01
        • 2015-06-19
        • 2011-04-23
        相关资源
        最近更新 更多