如何让 Excel RefreshAll 等待关闭直到完成?

Posted

技术标签:

【中文标题】如何让 Excel RefreshAll 等待关闭直到完成?【英文标题】:How do I make an Excel RefreshAll wait to close until finished? 【发布时间】:2016-03-21 16:17:02 【问题描述】:

我正在尝试使用以下 Python 脚本刷新 Excel 文件:

xl = Dispatch('Excel.Application')
workbook = xl.Workbooks.open('\\path\to\workbook.xlsx')
xl.Visible = True
workbook.RefreshAll()
xl.Quit()

但是,后台查询(连接到 SQL 数据库)需要一段时间才能刷新。

如何防止此电子表格在 RefreshAll 完成之前关闭?

【问题讨论】:

***.com/questions/22083668/… 我认为这是一个副本:***.com/questions/11832628/… 【参考方案1】:

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

xl = Dispatch('Excel.Application')
workbook = xl.Workbooks.open('\\path\to\workbook.xlsx')
xl.Visible = True
workbook.RefreshAll()
xl.CalculateUntilAsyncQueriesDone()
xl.Quit()

【讨论】:

【参考方案2】:

对于“查询”和数据透视表,您可以执行此操作您必须遍历每个工作表和查询/数据透视表以将背景刷新设置为 False,因为它是表本身的属性(而不是在工作簿级别,比如说。)

**对于数据透视表,Python 模块中的数据透视表似乎不可迭代,因此我基本上设置了一个计数器(根据需要进行调整)来查看每个工作表的最大(预期!)数据透视表数(我将其设置为 5)。一旦发现没有从 1 到 5 的索引号的数据透视表,它就会停止。(假设索引从 1 开始连续,并且您不能说没有数据透视表(1)但有数据透视表(2) . 如果这是错误的,请纠正我的答案!

for sheet in workbook.Sheets:
    print(sheet.name)
    for table in sheet.QueryTables:
        print("Found a query table on %s called %s" % (sheet.name, table.name))
        table.BackgroundQuery = False # i.e.: disable background query, and therefore cause Excel to 'wait' until it's done refreshing
        if table.Refresh() == True:     # This both refreshes the table, AND if the Refresh() method returns True (i.e.: refreshes successfully), tells you so.
            print("Query table %s refreshed!" % table.name)
        else:
            print("Query table %s FAILED to refresh." % table.name)
    for i in range(1,5):
        try:
            print("Found pivot table #%s called %s" % (i,sheet.PivotTables(i).Name))
            if sheet.PivotTables(i).RefreshTable()==True:
                print("Refreshed pivot table %s" % sheet.PivotTables(i).Name)
            else:
                print("FAILED to refresh pivot table %s" % sheet.PivotTables(i).Name)
        except:
            print("No pivot table #%s found on sheet %s" % (i,sheet.Name))
            break  # Break out of the for loop, since there's no point in continuing the search for pivots, I believe (but could be wrong about that!  Try creating two pivots, then deleting the first.  Does the second become PivotTables(1), or stay as 2?)

【讨论】:

注意:我还没有弄清楚如何禁用数据透视表的后台查询刷新...不确定这是否会给您带来问题。 目前这不是问题,因为我不需要数据透视表(至少现在)。我最终必须调查一下,我敢肯定。再次感谢!如果我这样做了,我会试试你的数据透视表建议,看看效果如何!

以上是关于如何让 Excel RefreshAll 等待关闭直到完成?的主要内容,如果未能解决你的问题,请参考以下文章

尝试后如何正确等待检查 Excel 实例是不是已关闭?

求各位大神帮忙解答!在下载或者导出excel表的时候,加入一个等待状态——thinkPHP3.2.3

C# Discord如何等待带有前缀的消息,然后响应它[关闭]

Excel 等待很长时间才能开始保存文档

在主窗体关闭并且不等待线程完成后让线程运行

Excel 正在等待另一个应用程序完成 OLE 操作