我正在尝试使用pyrtd https://code.google.com/p/pyrtd/Python模块用于获取可以通过RTD在Excel中获取的信息。
但是,当我尝试运行示例 python 脚本 http://code.google.com/p/pyrtd/source/browse/examples/rtdtime.py,我收到以下错误:
pywintypes.com_error:( -2147221164, 'Class not registered', None, None)
我尝试过其他几个 RTD 功能,有时(当我使用Dllname.function_name
作为参数RTDClient()
) I get:
pywintypes.com_error:( -2147221005, 'Invalid class string', None, None)
所有这些 RTD 函数都在 Excel 2010 中运行良好。
我还没有找到适用于 Python 的解决方案,但我已经了解了一些适用于 C# 的技巧:
- 适用于 Excel 实时数据 (RTD) 服务器的 C# 客户端 https://andrewsheppard.wordpress.com/2010/10/23/a-real-time-data-rtd-server-written-in-c/
- C# 中的 Excel RTD 客户端 http://awkwardcoder.com/2014/01/24/excel-rtd-client-in-c/
- http://bbs.csdn.net/topics/320252117 http://bbs.csdn.net/topics/320252117
- Excel RTD 服务器:C# 中的多个主题 http://blog.lab49.com/archives/2684
基本思想是:
-
从寄存器表中获取 rtd 服务器的类类型ProgID
(例如,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
is a bool
,将其设置为True
如果您请求新数据而不是缓存数据。
但是,我相信如果想要自动更新数据,就需要一个回调事件。
根据链接的博客文章 https://andrewsheppard.wordpress.com/2010/10/23/a-real-time-data-rtd-server-written-in-c/,事件类也可以通过progID
. 但我在reg表中没有找到任何.
在 C# 中,我认为也许可以创建一个IRTDUpdateEvent
。但我不知道如何用Python处理它。
有人可以帮助我解决这些错误吗?