我已将excelRTDserver.py启动并在Excel 2010(32位)中运行,方法是将EXCEL_TLB_MINOR
值更改为7
。我可以在加载项列表中看到服务器,如果我将=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对象运行makepy图书馆(1.6)。
非常感谢任何帮助。
答案 0 :(得分:4)
要解决这个问题,我已经在github上为pythoncom excel类型创建了一个新项目:
https://github.com/pyxll/exceltypes
这包括excelRTDServer.py
的略微修改版本,它使用新类型PyIRTDUpdateEvent
而不是win32com
makepy包装器,因此它现在可以在Excel 2010中使用(查找注释{ {1}}中的{1}}。
要构建项目,您需要安装visual studio(它不会使用gcc构建),您可以使用项目中包含的setup.py构建它,如下所示:
'EXCELTYPES_MODIFICATION'
如果您需要强制它使用visual studio而不是gcc,请使用exceltypes/demos/excelRTDServer.py
选项,例如,如果您正在使用anaconda。
如果要使用Visual Studio 2012而不是默认的2010,请将以下行添加到python setup.py install
:
"--compiler=msvc"
答案 1 :(得分:3)
我想你可能运气不好。
According to the author of excelRTDServer.py in a recent python-win32 thread:
这是响应的消息描述了你的完全问题,而且它是最近的,所以也许你已经直接得到了这个信息,但是如果你没有... < / SUP>
我担心IRTDUpdateEvent的内容随着最新版本而发生了变化 excel(从Excel 2007开始?我想那不再是'最近'了......)。
在寻找界面变化的消息时,我偶然发现了这一点 java论坛中的主题:
http://www.nevaobject.com/phpbb3/viewtopic.php?t=516
令我担心的是这条评论:
“显然在Excel 12(Excel 2007)中的RTD回调对象 实现双IRTDUpdateEvent接口抛出异常(通用COM 异常0x80020009)通过IDispatch调用时。如果你使用v-table 将调用绑定到UpdateNotify成功。我真的不知道是不是 是Excel 12或功能中的错误。“
到目前为止,我无法对MSDN信息进行确认... 但如果这是真的,它确实解释了所看到的问题。很多人 Web上的示例,pywin32 + makepy将此接口视为IDispatch, 并相应地包装它。
我认为我们现在不能用pywin32解决这个问题。我的 理解是它依赖于IDispatch支持。可能需要看一下 包装的comtypes(http://starship.python.net/crew/theller/comtypes/) (新?)IRTDUpdateEvent对象,或者可能是C扩展。 :(
答案 2 :(得分:1)
<强>的Python:强>
我得到“这个COM对象无法自动化makepy进程 - 请为此对象手动运行makepy”,但我已经为Microsoft Excel 12.0对象库(1.6)运行了makepy。
昨天在工作了一段时间后阅读你的问题,我忘了那是python而不是java :))..好吧,我现在唯一想到的是,你似乎需要为office 2010运行PIA
稍后编辑:如果你在我告诉你之后钢铁有问题,请评论而不是downvote,因为这个问题并不常见。
<强> JAVA:强>
这是因为缺少生成 v-tables 的选项。
您需要修改 ServerStart 方法以及IRTDServer
界面和IRTDServer_Impl class
。,因此CallbackObject
为COMIUnknown
。然后,您需要通过运行 IBuilder 生成IRTDServer_Skel
类。
现在您可以为 IRTDUpdateEvent
生成一个新的java包装器来请求v-table:
答案 3 :(得分:0)
当你把它放在&#39; -loop这样的东西时,有时会出现这个错误信息,这是一个hackly解决方案4u:导入时间,并使用&#39; sleep()&#39;在你的循环中
答案 4 :(得分:-1)
here中描述的IRTDUpdateEvent
问题(引发异常)应该在最新的Office 365版本中得到解决。
“显然,在Excel 12(Excel 2007)中,当通过IDispatch调用实现双重IRTDUpdateEvent接口的RTD回调对象时,将引发异常(通用COM异常0x80020009)。我真的不知道这是Excel 12中的错误还是功能。”
因此,excelRTDserver.py应该可以与最新版本的Office正常工作。换句话说,=RTD("Python.RTD.TimeServer","","seconds","5")
应该会按预期不断更新。