Python pywin32调用Excel路透TR函数报错及实例对接问题咨询
问题:pywin32调用Excel路透TR函数报COM错误
使用pywin32库通过Python运行Excel路透插件函数时初始实现代码如下:
from win32com import client from paths import path_onedrive import datetime as dt today = str(dt.datetime.today().date()).replace('-','') xlApp2 = client.Dispatch('Excel.Application') xlApp2.Visible = True wb = xlApp2.Workbooks.Add() wb.SaveAs(fr'{path_onedrive}\reuters\{today}.xlsx') ws_sheet1 = wb.Worksheets('Sheet1') ws_sheet1.Cells(1, 'A').Value = '=TR("USDSROIS=";"BID;ASK;TRDPRC_1;HST_CLOSE";"CH=Fd RH=IN";B2)'
需要执行的目标Excel公式为=TR("USDSROIS=";"BID;ASK;TRDPRC_1;HST_CLOSE";"CH=Fd RH=IN";B2),运行代码抛出如下COM错误:
Traceback (most recent call last): File "C:\Users\Sergej Shteriev\IdeaProjects\volatilityModels\classes_ir.py", line 23, in <module> ws_sheet1.Cells(1, 'A').Value = '=TR("USDSROIS=";"BID;ASK;TRDPRC_1;HST_CLOSE";"CH=Fd RH=IN";B2)' File "C:\ProgramData\Anaconda3\envs\volatilityModels\lib\site-packages\win32com\client\__init__.py", line 595, in __setattr__ self._oleobj_.Invoke(*(args + (value,) + defArgs)) pywintypes.com_error: (-2147352567, 'Exception occurred.', (0, None, None, None, 0, -2146827284), None)
初步判断报错原因是Dispatch启动的全新Excel实例未加载完成已登录鉴权的路透插件,因此尝试先打开已完成插件登录的空文件ReutersExcel.xlsx,再通过GetObject获取Excel实例:
os.startfile(fr'{path_onedrive}\reuters\ReutersExcel.xlsx') xlApp = client.GetObject(None, 'Excel.Application') xlApp.Visible = True
但执行后发现client.GetObject与client.Dispatch返回的对象方法接口不一致,无法继续后续操作。
解决方案
问题由两个核心原因导致,按以下步骤修复即可:
- 修正公式语法错误
代码里的公式字符串误用了HTML转义字符"代替双引号,这类转义是网页渲染用格式,Python写入Excel公式时直接使用普通双引号即可。另外注意公式参数分隔符需要和本机Excel的区域设置匹配,欧洲/中文默认环境用分号,英文环境需要替换为逗号。 - 用正确方法获取已加载插件的Excel实例
传入None参数的GetObject会返回低权限的COM代理对象,和Dispatch返回的实例接口天然不兼容。应该使用GetActiveObject获取当前系统中已经运行、且完成路透插件登录的Excel实例,该方法返回的对象和Dispatch接口完全一致,不存在方法不兼容问题。 - 补充必要的等待和兼容逻辑
不管是新启动Excel实例还是获取已运行实例,都要预留足够的插件加载时间,避免刚拿到实例就立刻写公式触发报错。
修正后的可运行代码如下:
import time import datetime as dt from win32com import client from paths import path_onedrive today = str(dt.datetime.today().date()).replace('-','') save_path = fr'{path_onedrive}\reuters\{today}.xlsx' # 优先抓取已经运行、已完成路透插件登录的Excel实例 try: xlApp = client.GetActiveObject('Excel.Application') except Exception: # 没有运行中的实例时再启动新的 xlApp = client.Dispatch('Excel.Application') # 预留插件加载时间,根据机器性能可调整为3-10秒 time.sleep(5) # 触发路透插件功能区加载,解决部分版本插件不自动激活的问题 try: xlApp.CommandBars.ExecuteMso("ThomsonReutersTab") time.sleep(1) except Exception: pass xlApp.Visible = True xlApp.DisplayAlerts = False # 新建工作簿并写入公式 wb = xlApp.Workbooks.Add() wb.SaveAs(save_path) ws_sheet1 = wb.Worksheets('Sheet1') # 注意公式里直接用双引号,不要用HTML转义字符 tr_formula = '=TR("USDSROIS=";"BID;ASK;TRDPRC_1;HST_CLOSE";"CH=Fd RH=IN";B2)' ws_sheet1.Cells(1, 'A').Value = tr_formula # 等待插件完成数据拉取后保存 time.sleep(3) wb.Save() xlApp.DisplayAlerts = True
调试提示:如果按上述代码修改后还是报错,先在代码打开的Excel窗口里手动找空白单元格输入TR公式测试,确认插件登录状态正常、函数可以手动调用后再排查代码问题。
内容的提问来源于stack exchange,提问作者deblue
相关产品推荐
相关产品推荐

