我正在尝试使用 pyrtd Python模块获取Excel中可以通过RTD获取的信息。
但是,当我尝试运行 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# 的技巧:
- A C# client for Excel real-time data (RTD) servers
- Excel RTD Client in C#
- http://bbs.csdn.net/topics/320252117
- Excel RTD Servers: Multiple Topics in 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, topic, 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 对象
关于python - 如何使用pyrtd/pythoncom解决 `pywintypes.com_error`问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25181932/