我正在尝试使用Python的pyrtd模块来获取可以通过RTD在Excel中获得的信息。
但是,当我尝试运行sample python script时,出现以下错误:
pywintypes.com_error:( -2147221164, 'Class not registered', None, None)
我尝试了其他几种RTD功能,有时(当我使用Dllname.function_name
作为RTDClient()
的参数时)我得到了:
pywintypes.com_error:( -2147221005, 'Invalid class string', None, None)
所有这些RTD功能在Excel 2010中都能很好地工作。
我还没有找到Python的解决方案,但我已经了解了C#的一些提示:
从ProgID
的注册表中获取rtd服务器的类类型(例如,RTDTime.RTD
,如果您已经使用过HKEY_LOCAL_MACHINE\SOFTWARE\Classes\RTDTime.RTD中找到它们> regsvr32 注册dll)。
在C#中,函数为Type.GetTypeFromProgID()
。 我相信Python模块win32com
中有相同的功能。
将服务器类强制转换为IRtdServer
(Microsoft.Office.Interop.Excel.IRtdServer
)。
然后可以使用IRtdServer.ConnectData(topicID, topics, newData)
获取数据:
topicID
似乎是随机的int
; topics
是您在Excel中使用的参数,它是一个数组; newData
是bool
,如果您请求新数据而不是缓存数据,则将其设置为True
。但是,我相信如果想要自动更新数据,就需要一个回调事件。
根据the linked blog post,事件类也可以通过progID
获得。 但我没有在注册表中找到任何内容。
在C#中,我认为可以创建一个IRTDUpdateEvent
。但我不知道如何用Python处理它。
有人可以帮我解决这些错误吗?
答案 0 :(得分:2)
解决。安装并使用32位ActivePython
http://python.6.x6.nabble.com/Problem-using-win32com-client-Dispatch-on-Win7-64bit-td1957248.html
这可能是因为我正在使用64位python并尝试获取32位com对象
答案 1 :(得分:0)
P.S。
pyrtd模块仅支持单主题订阅。
用户需要对pyrtd.py进行少许修改以传递元组以启用多个主题sub:
Line116
self._rtd.ConnectData(id, list(topic), True)