我正在开发一种回归测试工具,可以验证大量的Excel电子表格。目前,我使用最新版本的pywin32产品通过COM从Python脚本控制它们。不幸的是,COM似乎有许多恼人的缺点:
例如,最轻微的沮丧似乎能够破坏与COM服务器的连接,一旦被切断,似乎没有安全的方法来重新连接到Excel应用程序。 COM应用程序对象内置绝对没有安全性。
Excel COM界面不允许我安全地远程控制在同一工作簿文件上运行的Excel应用程序的两个单独实例,即使它们是只读的。
此外,当出现问题时,我很少得到任何有用的错误消息......除了数字错误代码或几乎没有用的消息,例如“发生了异常”,我最多可以。几乎不可能知道出现问题的原因。
最后,COM缺乏控制Excel的一些最基本方面的能力?例如,没有办法确保关闭COM客户端连接到的Excel进程。您甚至无法使用COM来查找Excel的PID。
那么如果我完全抛弃COM会怎样?有没有其他方法可以控制Excel?
我想要做的就是运行宏,打开和关闭工作簿以及读写单元格范围?也许一些.NET专家知道还有一两个尚未冒泡进入Python社区的技巧?你的办公室黑客怎么样?难道有更好的方法来获得Excel的内部而不是COM吗?
答案 0 :(得分:7)
没有办法完全绕过COM。您可以使用VSTO(Visual Studio Tools for Office),它在COM对象上有很好的.NET包装器,但它仍然是COM下面的。
答案 1 :(得分:2)
Excel COM界面不允许我安全地远程控制在同一工作簿文件上运行的Excel应用程序的两个单独实例,即使它们是只读的。
这不是COM的限制,这是limitation of Excel。如果它们存在于不同的目录中,Excel甚至不允许您同时打开两个具有相同名称的文件。这是Excel程序的一个基本限制。
回答您的其他问题
如果检查python文档,如果连接丢失,应该有一种方法可以连接到现有服务器。
缺少有用的错误消息可能与Python有关。
您甚至无法使用COM查找Excel的PID。
COM是一个内部对象模型,可以显示它的内容。 PID对于外部进程可以与内部进程一样多,没有真正的理由作为COM接口公开。
答案 2 :(得分:1)
也可以将Excel作为服务器应用程序运行并将其用作计算引擎。这允许非IT用户在Excel中指定业务规则并通过Web服务调用它们。我自己没有用过这个,但我知道我的一个同事曾经使用过这个。 Walkthrough: Developing a Custom Application Using Excel Web Services可能是一个很好的起点。乍一看该页面看起来需要Sharepoint。这可能不适合每个环境。
答案 3 :(得分:1)
您是否查看了xlrd和xlwt套餐?我不再需要它们了,但是我在上一个项目中使用xlrd取得了很好的成功。最后我知道,他们无法处理宏,但可以进行电子表格的基本读写。此外,它们是独立于平台的(我编写的程序的目标是在Linux上运行)!
答案 4 :(得分:1)
您可以将Jython与JExcelApi(http://jexcelapi.sourceforge.net/)一起使用来控制您的Excel应用程序。我一直在考虑用我的一个PyQt项目实现这个解决方案,但还没有尝试过。我以前在Java应用程序中有效地使用过JExcelApi,但是没有使用过Jython(虽然我知道你可以导入Java类)。
注意:JExcelApi可能是引擎盖下的COM(我不确定)。