有没有更好的方法(除了 COM)来远程控制 Excel?
Posted
技术标签:
【中文标题】有没有更好的方法(除了 COM)来远程控制 Excel?【英文标题】:Is there a better way (besides COM) to remote-control Excel? 【发布时间】:2010-10-06 10:36:15 【问题描述】:我正在开发一种回归测试工具,该工具将验证大量 Excel 电子表格。目前,我使用最新版本的 pywin32 产品通过 Python 脚本通过 COM 控制它们。不幸的是,COM 似乎有许多恼人的缺点:
例如,最轻微的干扰似乎能够中断与 COM-Server 的连接,一旦断开,似乎没有安全的方法可以重新连接到 Excel 应用程序。 COM 应用程序对象中绝对没有内置安全性。
Excel COM 接口不允许我安全地远程控制在同一个工作簿文件上运行的 Excel 应用程序的两个单独实例,即使它们是只读的。
此外,当确实出现问题时,我很少收到任何有用的错误消息……最多只能是数字错误代码或几乎没有用的消息,例如“发生异常”。几乎不可能知道为什么会出错。
最后,COM 缺乏控制 Excel 一些最基本方面的能力?例如,没有办法保证只关闭 COM 客户端所连接的 Excel 进程。你甚至不能使用 COM 来查找 Excel 的 PID。
如果我完全放弃 COM 会怎样? 有没有其他方法可以控制 Excel?
我只想运行宏、打开和关闭工作簿以及读取和写入单元格范围?也许一些 .NET 专家知道一两个尚未进入 Python 社区的技巧?你们办公室黑客呢?有没有比 COM 更好的方法来了解 Excel 的内部结构?
【问题讨论】:
Excel 的真正金丝雀正在尝试跨安装了不同版本 Excel 的平台分发您的应用程序。真是个混蛋,真的,但我从来没有发现除了 COM 之外的任何其他方式,你可以走 PIA 路线,但它是一样的。 +1 - 这不是真的! 【参考方案1】:没有办法完全绕过 COM。您可以使用 VSTO(Visual Studio Tools for Office),它在 COM 对象上有很好的 .NET 包装器,但它在下面仍然是 COM。
【讨论】:
【参考方案2】:还可以将 Excel 作为服务器应用程序运行并将其用作计算引擎。这允许非 IT 用户在 Excel 中指定业务规则并通过 Web 服务调用它们。我自己没有使用过这个,但我知道我的一个同事曾经使用过这个。 Walkthrough: Developing a Custom Application Using Excel Web Services 可能是一个很好的起点。乍一看该页面似乎需要 Sharepoint。这可能不适用于所有环境。
【讨论】:
【参考方案3】:您看过xlrd 和xlwt 包吗?我不再需要它们了,但是我在上一个项目中使用 xlrd 取得了很好的成功。最后我知道,他们不能处理宏,但可以对电子表格进行基本的读写。而且,它们是独立于平台的(我编写的程序是针对在 Linux 上运行的)!
【讨论】:
好建议,不幸的是在这种情况下宏是必不可少的。这实际上是一些 C++ XLA 对我感兴趣的宏的影响,而不是电子表格的实际内容。反正你有一个赞成票!【参考方案4】:您可以使用 Jython 和 JExcelApi (http://jexcelapi.sourceforge.net/) 来控制您的 Excel 应用程序。我一直在考虑用我的一个 PyQt 项目来实现这个解决方案,但还没有开始尝试。我之前在 Java 应用程序中有效地使用过 JExcelApi,但没有使用过 Jython(虽然我知道你可以导入 Java 类)。
注意:JExcelApi 可能是底层的 COM(我不确定)。
【讨论】:
【参考方案5】:Excel COM 接口不允许我安全地远程控制在同一个工作簿文件上运行的 Excel 应用程序的两个单独实例,即使它们是只读的。
这不是 COM 的限制,这是一个limitation of Excel。如果两个同名文件存在于不同的目录中,Excel 甚至不允许您同时打开它们。这是 Excel 程序的基本限制。
回答您的其他问题
如果您检查您的 python 文档,应该有一种方法可以在连接丢失时连接到现有服务器。
再次缺少有用的错误消息可能与 Python 有关。
您甚至无法使用 COM 来查找 Excel 的 PID。
COM 是一个内部对象模型,它公开了它想要的东西。 PID 对外部进程和内部进程一样可用,没有真正的理由公开为 COM 接口。
【讨论】:
以上是关于有没有更好的方法(除了 COM)来远程控制 Excel?的主要内容,如果未能解决你的问题,请参考以下文章
有没有比使用 Console.Clear() 更好的方法来制作控制台游戏?
iPhone - 线程 1 EXC_BAD_INSTRUCTION 错误,控制台中没有打印任何内容
com.fasterxml.jackson.databind.exc.MismatchedInputException: