有没有更好的方法(除了COM)来远程控制Excel?

我正在开发一个回归testing工具来validation大量的Excel电子表格。 目前我使用最新版本的pywin32产品通过Python脚本控制它们。 不幸的是COM似乎有一些烦人的缺点:

例如,最轻微的烦恼似乎能够中断与COM服务器的连接,一旦切断似乎没有安全的方式重新连接到Excel应用程序。 COM应用程序对象中没有内置的安全性。

Excel COM接口不允许我安全地远程控制在同一个工作簿文件上运行的Excel应用程序的两个独立实例,即使它们是只读的。

另外当出现问题时,我很less得到任何有用的错误消息……至多我可以除了一个数字错误代码或几乎没有用的消息,如“发生exception”。 知道为什么出问题几乎是不可能的。

最后,COM缺乏控制Excel某些最基本方面的能力? 例如,没有办法保证只closuresCOM客户端连接的Excel进程。 你甚至不能使用COM来查找Excel的PID。

那么,如果我完全放弃COM呢? 有没有其他的方法来控制Excel?

我想要做的就是运行macros,打开和closures工作簿,读写单元格范围? 也许一些.NET专家知道还有一两个尚未冒泡到Python社区的技巧? 那么你的办公室黑客呢? 有没有比COM更好的方法来获取Excel的内部?

没有办法完全绕开COM。 你可以使用VSTO(Visual Studio Tools for Office),它在COM对象上有很好的.NET封装,但是它仍然是COM的底层。

Excel COM接口不允许我安全地远程控制在同一个工作簿文件上运行的Excel应用程序的两个独立实例,即使它们是只读的。

这不是COM的限制,这是Excel的限制 。 如果它们存在于不同的目录中,Excel甚至不会让你同时打开两个同名的文件。 这是Excel程序的一个基本限制。

回答你的其他问题

如果你检查你的Python文档,应该有一种方法来连接到现有的服务器,如果连接丢失。

再次缺乏有用的错误信息可能与Python有关。

你甚至不能使用COM来查找Excel的PID。

COM是一个内部对象模型,并暴露了它的意愿。 外部进程可以使用外部进程PID,但是没有真正的理由将其作为COM接口进行公开。

也可以将Excel作为服务器应用程序运行,并将其用作计算引擎。 这允许非IT用户在Excel中指定业务规则并通过web服务调用它们。 我自己也没有用过,但是我知道我的一个同事曾经用过这个。 演练:使用Excel Web Services开发自定义应用程序可能是一个很好的起点。 第一眼看到该页面看起来像需要Sharepoint。 这可能不适合每个环境。

你看过xlrd和xlwt包吗? 我不再需要他们了,但是我在最后一个项目上用xlrd取得了很大的成功。 最后我知道,他们不能处理macros,但可以对电子表格进行基本的读写。 而且,他们是平台独立的(我写的程序是针对在Linux上运行的)!

您可以使用Jython和JExcelApi( http://jexcelapi.sourceforge.net/ )来控制您的Excel应用程序。 我一直在考虑用我的一个PyQt项目来实现这个解决scheme,但还没有到处去尝试它。 我以前在Java应用程序中有效地使用了JExcelApi,但是没有使用过Jython(尽pipe我知道你可以导入Java类)。

注意:JExcelApi可能是引擎盖下的COM(我不确定)。