【问题标题】:Is there a better way (besides COM) to remote-control Excel?有没有更好的方法(除了 COM)来远程控制 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 - 这不是真的!

标签: python .net excel com


【解决方案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】:

      您看过xlrdxlwt 包吗?我不再需要它们了,但是我在上一个项目中使用 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 接口。

        【讨论】:

          猜你喜欢
          • 2012-09-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-17
          • 2023-04-03
          • 2013-04-04
          • 1970-01-01
          • 2019-12-08
          相关资源
          最近更新 更多