我正在尝试使用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
从register表中获取rtd服务器的类类型(例如,RTDTime.RTD
,如果已经使用了regsvr32来注册dll,则可以在HKEY_LOCAL_MACHINE\SOFTWARE\Classes\RTDTime.RTD
中找到它们)。
在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来处理它。
有人能帮我解决这些错误吗?
解决了。安装并使用32位ActivePython
http://python.6.x6.nabble.com/Problem-using-win32com-client-Dispatch-on-Win7-64bit-td1957248.html
可能是因为我正在使用64位python并试图获取32位com对象
附则
pyrtd模块只支持单主题订阅。
用户只需对pyrtd.py稍加修改即可传递元组以启用多个主题子:
第116行
相关问题 更多 >
编程相关推荐