【问题标题】:Excel RTD server in Python not updating dataPython中的Excel RTD服务器不更新数据
【发布时间】:2012-04-16 15:35:19
【问题描述】:

通过将EXCEL_TLB_MINOR 值更改为7,我已经在Excel 2010(32 位)中启动并运行excelRTDserver.py。我可以在加载项列表中看到服务器,如果我在单元格中输入=RTD("Python.RTD.TimeServer","","seconds","5"),我会得到当前时间。但它永远不会更新。如果我将“5”更改为另一个数字,我会收到更新,但在初始更改后它不再更改。

如何让它更新?我找到了其他人有类似问题here,但没有解决方案。

更新:我还有一点——将 PyIDispatch 回调对象转换为 IRTDUpdateEvent 回调对象时,ServerStart 中引发了一个异常。使用this method 捕获错误消息,我得到“当该文件已存在时无法创建文件。”。如果我遵循建议 here 并使用 win32com.client.CastTo(CallbackObject,'IRTDUpdateEvent') 我得到“此 COM 对象无法自动化 makepy 过程 - 请为此对象手动运行 makepy”,但我已经为 Microsoft Excel 12.0 对象库 (1.6) 运行 makepy .

任何帮助将不胜感激。

【问题讨论】:

    标签: python excel com rtd


    【解决方案1】:

    为了解决这个问题,我在 github 上为 pythoncom excel 类型创建了一个新项目:

    https://github.com/pyxll/exceltypes

    这包括 excelRTDServer.py 的略微修改版本,它使用新类型 PyIRTDUpdateEvent 而不是 win32com makepy 包装器,因此它现在可以在 Excel 2010 中使用(在 exceltypes/demos/excelRTDServer.py 中查找 cmets 'EXCELTYPES_MODIFICATION' )。

    要构建项目,您需要安装 Visual Studio(它不会使用 gcc 构建),您可以使用项目中包含的 setup.py 构建它,如下所示:

    python setup.py install
    

    如果您需要强制它使用 Visual Studio 而不是 gcc,请使用 "--compiler=msvc" 选项,例如,如果您使用的是 anaconda。 如果您想使用 Visual Studio 2012 而不是默认的 2010,则将以下行添加到 setup.py

    from distutils import msvc9compiler
    msvc9compiler.VERSION = 11
    

    【讨论】:

      【解决方案2】:

      我认为你可能不走运。

      According to the author of excelRTDServer.py in a recent python-win32 thread:

      这是回复的消息描述了您的确切问题,而且它是最近的,所以也许您已经直接获得了此信息,但如果您没有...

      我担心 IRTDUpdateEvent 的内容会随着最近的版本而改变 的 excel (自 Excel 2007 以来?我想这不再是“最近”了......)。

      在四处寻找界面变化的消息时,我遇到了这个 java论坛中的线程:

      http://www.nevaobject.com/phpbb3/viewtopic.php?t=516

      让我担心的是这条评论:

      "显然在 Excel 12 (Excel 2007) 中的 RTD 回调对象 实现双 IRTDUpdateEvent 接口抛出异常(通用 COM 当通过 IDispatch 调用时出现异常 0x80020009)。如果你使用 v-table 将调用绑定到 UpdateNotify 成功。我真的不知道是不是 是 Excel 12 中的错误或功能。”

      到目前为止,我还无法根据 MSDN 信息确认这一点... 但如果这是真的,它确实解释了所看到的问题。很多老 网上的例子,pywin32+makepy把这个接口当成IDispatch, 并相应地包装它。

      我认为我们不能像现在这样用 pywin32 解决这个问题。我的 理解是它依赖于 IDispatch 支持。可能需要看 comtypes (http://starship.python.net/crew/theller/comtypes/) 来包装 (新?)IRTDUpdateEvent 对象,或者可能是 C 扩展。 :(

      【讨论】:

      • 是的,我也在那里发布了这个问题。看来我倒霉了。
      【解决方案3】:

      Python:

      我收到“此 COM 对象无法自动执行 makepy 过程 - 请为此对象手动运行 makepy”,但我已为 Microsoft Excel 12.0 对象库 (1.6) 运行 makepy。 p>

      昨天在工作中读了你的问题后,我忘了那是 python 而不是 java :)).. 好吧,我现在唯一想的是,你似乎需要为 office 2010 运行PIA

      稍后编辑:如果您在我告诉您之后遇到问题。请发表评论而不是投反对票,因为这个问题并不常见。

      JAVA:

      发生这种情况是因为缺少生成 v-tables 的选项。

      你需要修改ServerStart方法以及IRTDServer接口和IRTDServer_Impl class.,所以CallbackObjectCOMIUnknown。然后你需要通过运行IBuilder来生成IRTDServer_Skel类。

      现在您可以为 IRTDUpdateEvent 生成一个新的 java 包装器来请求 v-table:

      【讨论】:

      • 感谢您的回复,不胜感激。但是,我正在寻找 Python 解决方案。遗憾的是,我的 Java 并不流利。
      • 投反对票的不是我,我在寻求帮助,而你正在给予帮助。不幸的是,我安装了 PIA,但它没有帮助。
      • pff.,明天我检查一下,0:30a.m 这里
      【解决方案4】:

      当您将其放入“for”循环之类的内容时,有时会出现该错误消息,这是一个 hackly 解决方案 4u:导入时间,并在您的循环中使用“sleep()”

      【讨论】:

        【解决方案5】:

        here 中描述的IRTDUpdateEvent 问题(抛出异常)应该在最新的 Office 365 版本中得到修复。

        “显然在 Excel 12 (Excel 2007) 中,实现双 IRTDUpdateEvent 接口的 RTD 回调对象在通过 IDispatch 调用时抛出异常(通用 COM 异常 0x80020009)。如果使用 v-table 绑定,则调用 UpdateNotify 成功。我不真的不知道这是 Excel 12 中的错误还是功能。”

        因此excelRTDserver.py 应该可以在最新版本的 Office 中正常工作。换句话说,=RTD("Python.RTD.TimeServer","","seconds","5") 应该会按预期不断更新。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-02-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-10
          • 1970-01-01
          • 2011-04-05
          • 1970-01-01
          相关资源
          最近更新 更多