【问题标题】:C# app that uses Excel Interop, easy switch between 2003 2007?使用 Excel 互操作的 C# 应用程序,2003 和 2007 之间轻松切换?
【发布时间】:2011-02-24 21:48:16
【问题描述】:

我编写了一个应用程序,它只在电子表格上执行非常基本的 I/O。读入一堆单元格,进行一些排序,然后将输出转储回另一个电子表格。在我的机器上工作得很好。我已经安装了 Office 2003。

当它使用 2007 在别人的机器上运行时,它会爆炸,可能是由于 Interop 程序集的不同版本。

我希望有人知道一种方法,可以根据 office 版本动态更改加载程序集的位置/位置(从注册表中获取 office 版本很容易)。

通过互联网的其余部分进行筛选,我没有看到任何表明这是可能的 :( 。我尝试安装 2007 PIA,但是当我尝试添加参考时,它们没有出现,我不知道在哪里浏览它们(它们不在 c:\windows\assemblies\ 中;也许安装不起作用)。每次我需要进行更新时,我是否必须获得一台安装了 2007 的机器来构建?

【问题讨论】:

  • “它炸弹”并不能帮助我们帮助您。错误消息旨在诊断问题。不要因为你不理解而忽略它们,这里肯定有人会。

标签: c# excel interop assemblies excel-2003


【解决方案1】:

看看我的项目MS Office for .NET

它是一组托管程序集,其中包含使用后期绑定和动态加载的 COM 对象在 VB.NET 中编写的包装器类型。它适用于版本 97-2007。 不需要 PIA。

我保留了对象模型,因此大多数 VSTO 示例只需进行少量更改即可工作。

希望对你有帮助。

【讨论】:

  • 虽然该库可能不错,但缺少文档,并且只有很少的示例,并且缺少帮助,例如如何打开受密码保护的文件...必须挖掘源代码才能找到它
【解决方案2】:

实际上更有可能代表兼容性问题的运行时版本,而不是 PIA。

当它使用 2007 在别人的机器上运行时,它会爆炸, 估计是因为不同 互操作程序集的版本。

我知道它可能会有这种“感觉”,但这种情况不太可能发生。 Excel 2007 PIA 比 2003 PIA 更宽,而不是更窄。可能会添加类型、成员和可选参数,但旧的 2003 签名将保持不变。因此,无论是通过 2003 PIA 还是 2007 PIA,您在 2003 年的所有旧呼叫都将以相同的方式运行。当然,这不是 100.00% 的保证,但我猜大概在 99.8% 左右。

我希望有人知道一种方法 动态更改哪个/在哪里 程序集的加载取决于 办公版(获取办公 版本很容易从注册表中)。

您需要使用反射,例如 Assembly.LoadFrom 方法。但我真的不认为你需要走这条路,老实说。实际上,为了证明这一点,您应该将程序集中的引用更改为 2007 版本,编译它,然后运行。我敢打赌你会得到同样的错误。

但是为什么会这样呢?您将如何解决?

Excel 2003 和 Excel 2007 对象模型之间的兼容性问题很少,但也有一些。一个示例是 Range.Cells.Count 属性,它返回一个最大值为 +43 亿的 Int32。 (大约)。然而,随着 Excel 2007 中引入的更大的工作表,电子表格上的单元格数量实际上约为 172 亿。因此,如果 Range 太大(例如,包含整个工作表),Range.Cells.Count 会引发异常。相反,您必须调用 Range.Cells.CountLarge,因为它返回 Int64,因此可以处理更大的结果。

因此,实际上最有可能代表兼容性问题的是运行时版本,而不是 PIA。因此,您应该隔离引发异常的行,并让我们知道错误消息是什么。那也许我们可以帮忙……

-- 迈克

【讨论】:

    猜你喜欢
    • 2012-03-18
    • 2011-01-24
    • 2010-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-09
    • 1970-01-01
    • 2010-12-02
    相关资源
    最近更新 更多