Python中的Excel RTD服务器未更新d

2024-09-30 00:37:37 发布

您现在位置:Python中文网/ 问答频道 /正文

通过将EXCEL_TLB_MINOR值改为7,我已经在excel2010(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”,但我已经运行了makepy for Microsoft Excel 12.0对象库(1.6)。在

任何帮助都将不胜感激。在


Tags: 文件对象py服务器插件列表hereexcel
3条回答

我想你可能走运了。在

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

响应的消息描述了您的精确问题,而且是最近的问题,所以您可能已经直接得到了此信息,但万一您没有…。

I fear that things with IRTDUpdateEvent have changed with recent versions of excel (since Excel 2007? I guess that's not so 'recent' anymore...).

While hunting around for news of interface changes, I came across this thread in a java forum:

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

The part that worries me is this comment:

"Apparently in Excel 12 (Excel 2007) the RTD callback object that implements dual IRTDUpdateEvent interface throws exception (generic COM exception 0x80020009) when is called via IDispatch. If you use v-table binding the call to UpdateNotify succeeds. I don't really know whether it is a bug in Excel 12 or a feature."

到目前为止,我还不能根据MSDN的信息来证实这一点。。。 但如果这是真的,它确实能解释人们看到的问题。很多老人 web上的示例,以及pywin32+makepy将此接口视为IDispatch, 并相应地包装起来。在

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

Python:

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

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

稍后编辑:如果你的钢铁在我告诉你的之后有问题,请发表评论,不要投否决票,因为这个问题并不常见。在

JAVA:

这是因为缺少生成v表的选项。在

您需要修改ServerStart方法以及IRTDServer接口和IRTDServer_Impl class,因此CallbackObject是{}。然后您需要通过运行IBuilder来生成IRTDServer_Skel类。在

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

enter image description here

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

https://github.com/pyxll/exceltypes

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

要构建项目,您需要安装visualstudio(它不会使用gcc构建),您可以使用设置.py包含在项目中的内容如下:

python setup.py install

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

^{pr2}$

相关问题 更多 >

    热门问题