You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Python调用Excel“从Dynamics 365刷新”插件按钮

Python调用Excel「从Dynamics 365刷新」按钮实现方案

运行代码前先通过pip install pywin32安装依赖,你原有代码缺少win32com库的导入,会直接运行报错。
替换原有wb.RefreshAll()逻辑有两种稳定实现方式,优先使用连接级刷新方案,稳定性远高于模拟点击UI按钮。

方案1:精准刷新Dynamics 365绑定连接(推荐)

「从Dynamics 365刷新」按钮的本质是刷新工作簿中绑定了Dynamics 365数据源的特定连接,直接定位对应连接刷新可以避开UI加载延迟、按钮ID不匹配的问题:

# 替换wb.RefreshAll()位置的代码
d365_refreshed = False
for conn in wb.Connections:
    # 匹配OLEDB类型的Dynamics 365连接
    if conn.Type == 1:
        conn_config = str(conn.OLEDBConnection.Connection)
        if "Dynamics 365" in conn.Name or "dynamics.com" in conn_config:
            # 关闭后台刷新,强制等待刷新完成再执行后续逻辑
            conn.OLEDBConnection.BackgroundQuery = False
            conn.Refresh()
            d365_refreshed = True

方案2:直接触发功能区按钮动作

如果找不到对应连接,可以直接遍历Excel命令栏控件,匹配按钮名称后执行点击动作:

# 替换wb.RefreshAll()位置的代码
button_triggered = False
# 先尝试用官方Mso ID触发,响应速度最快
try:
    xlapp.CommandBars.ExecuteMso("RefreshfromDynamics365")
    button_triggered = True
except:
    # ID不匹配时遍历所有命令栏控件找对应按钮
    for cmd_bar in xlapp.CommandBars:
        for ctrl in cmd_bar.Controls:
            ctrl_name = str(ctrl.Caption)
            if "从Dynamics 365刷新" in ctrl_name or "Refresh from Dynamics 365" in ctrl_name:
                ctrl.Execute()
                button_triggered = True
                break
        if button_triggered:
            break

修正后完整可运行代码

import time
import win32com.client as win32

# 初始化Excel实例
xlapp = win32.DispatchEx('Excel.Application')
xlapp.Visible = True
xlapp.DisplayAlerts = False # 关闭弹窗提示,避免刷新/保存时卡确认框

# 打开目标工作簿,替换为你的文件绝对路径
wb = xlapp.Workbooks.Open(r'C:\你的文件路径\目标文件.xlsx')
time.sleep(5) # 等待文件完全加载

def refresh_excel():
    # 优先刷新D365专属连接
    d365_refreshed = False
    for conn in wb.Connections:
        if conn.Type == 1:
            conn_config = str(conn.OLEDBConnection.Connection)
            if "Dynamics 365" in conn.Name or "dynamics.com" in conn_config:
                conn.OLEDBConnection.BackgroundQuery = False
                conn.Refresh()
                d365_refreshed = True
    
    # 未找到对应连接时触发功能区按钮
    if not d365_refreshed:
        try:
            xlapp.CommandBars.ExecuteMso("RefreshfromDynamics365")
        except:
            for cmd_bar in xlapp.CommandBars:
                for ctrl in cmd_bar.Controls:
                    ctrl_name = str(ctrl.Caption)
                    if "从Dynamics 365刷新" in ctrl_name or "Refresh from Dynamics 365" in ctrl_name:
                        ctrl.Execute()
                        break
                else:
                    continue
                break
    
    # 等待计算、刷新动作全部完成
    while xlapp.CalculationState != 0: # 0对应xlDone,即计算完成状态
        time.sleep(1)
    time.sleep(2)
    wb.Save()

# 定时循环刷新
while True:
    refresh_excel()
    time.sleep(7200) # 间隔2小时刷新一次
    wb.Save()

注意事项

  • 运行前确认Excel中已启用「Dynamics 365 for Office」加载项,否则按钮不存在会触发执行失败
  • 若官方Mso ID触发失败,可以在Excel自定义功能区面板找到对应按钮,悬停查看实际控件ID替换即可
  • 不建议用硬编码长等待的方式等刷新,通过BackgroundQuery = False和计算状态判断可以大幅提升脚本稳定性,避免刷新未完成就保存导致数据缺失

内容的提问来源于stack exchange,提问作者user18299975

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 12:31:01