8

通过将EXCEL_TLB_MINOR更改为7. 我可以在加载项列表中看到服务器,如果我进入=RTD("Python.RTD.TimeServer","","seconds","5")一个单元格,我会得到当前时间。但它永远不会更新。如果我将“5”更改为另一个数字,我会得到一个更新,但在初始更改后它不再更改。

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

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

任何帮助将不胜感激。

4

5 回答 5

4

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

https://github.com/pyxll/exceltypes

这包括一个稍微修改过的版本,excelRTDServer.py它使用新类型PyIRTDUpdateEvent而不是win32commakepy 包装器,因此它现在可以在 Excel 2010 中使用(在 中查找注释'EXCELTYPES_MODIFICATION'exceltypes/demos/excelRTDServer.py

要构建项目,您需要安装 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
于 2014-06-04T10:02:26.650 回答
3

我想你可能不走运。

根据最近 python-win32 线程中 excelRTDServer.py 的作者

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

我担心 IRTDUpdateEvent 的事情随着最新版本的 excel 而发生了变化(自 Excel 2007 以来?我想这不再是“最近”了......)。

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

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

让我担心的部分是这条评论:

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

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

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

于 2012-04-11T22:18:45.993 回答
1

Python:

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

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

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

爪哇:

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

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

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

在此处输入图像描述

于 2012-04-11T10:33:55.787 回答
0

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

于 2014-12-23T11:53:33.403 回答
-1

此处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")应该按预期不断更新。

于 2020-01-12T23:28:34.237 回答