如何通过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
相关产品推荐
相关产品推荐

