2

我正在尝试使用 Python 的pyrtd模块来获取可以通过 RTD 在 Excel 中获取的信息。

但是,当我尝试运行示例 python 脚本时,我收到以下错误:

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# 的技巧:

基本思想是:

  1. 从注册表中获取 rtd 服务器的类类型ProgID(例如,如果您已经使用regsvr32注册了 dll ,则RTDTime.RTD可以在 中找到它们)。HKEY_LOCAL_MACHINE\SOFTWARE\Classes\RTDTime.RTD

    在 C# 中,函数是Type.GetTypeFromProgID(). 我相信 Python 模块中有相同的功能win32com

  2. 将服务器类强制转换为IRtdServer( Microsoft.Office.Interop.Excel.IRtdServer)。

  3. 然后可以IRtdServer.ConnectData(topicID, topics, newData)用来获取数据:

    • topicID似乎是随机的int
    • topics是你在Excel中使用的参数,它是一个数组;
    • newData是 a boolTrue如果您请求新数据而不是缓存数据,请将其设置为。
  4. 但是,我相信如果想要自动更新数据,则需要一个回调事件。

根据链接的博客文章,事件类也可以通过progID但我在 reg 表中没有找到任何内容

在 C# 中,我认为可以创建一个IRTDUpdateEvent. 但我不知道如何用 Python 处理它。

有人可以帮我解决这些错误吗?

4

2 回答 2

2

解决了。安装和使用 32 位 ActivePython

http://python.6.x6.nabble.com/Problem-using-win32com-client-Dispatch-on-Win7-64bit-td1957248.html

这可能是因为我正在使用 64 位 python 并试图获取 32 位 com 对象

于 2014-08-08T06:07:17.207 回答
0

附言

pyrtd 模块仅支持单主题订阅。

用户只需对 pyrtd.py 进行少量修改即可传递一个元组以启用多个主题子:

116线

self._rtd.ConnectData(id, list(topic), True)
于 2014-08-08T08:25:14.303 回答