Python中的Excel RTD服务器不更新数据

时间:2012-04-03 00:12:42

标签: python excel com rtd

我已将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)。

非常感谢任何帮助。

5 个答案:

答案 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。,因此CallbackObjectCOMIUnknown。然后,您需要通过运行 IBuilder 生成IRTDServer_Skel类。

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

enter image description here

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