使用Excel Interop的C#app,在2003年之间轻松切换?

时间:2010-05-27 22:19:45

标签: c# excel interop assemblies excel-2003

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

当它在2007年的某个机器上运行时,它会发生轰炸,可能是由于Interop组件的不同版本。

我希望有人知道如何根据办公室版本动态更改装配装配的位置(从登记处轻松获取办公室版本)。

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

2 个答案:

答案 0 :(得分:1)

查看我的项目MS Office for .NET

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

我保留了对象模型,因此大多数VSTO样本只能进行少量更改。

我希望,这有帮助。

答案 1 :(得分:1)

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

  

当它在2007年的某个机器上运行时,它就会爆炸,   大概是由于不同   Interop程序集的版本。

我知道它可能“感觉”这种方式,但这种情况不太可能。 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属性,它返回一个最大值为+4.3 bil的Int32。 (约)。但是,随着Excel 2007中引入的更大的工作表,电子表格中的单元格数实际上大约为17.2亿。因此,如果Range太大(例如,包含整个工作表),则Range.Cells.Count会引发异常。相反,你必须调用Range.Cells.CountLarge,因为它返回一个Int64,可以处理更大的结果。

因此,实际上很可能是表示兼容性问题的运行时版本,而不是PIA。因此,您应该隔离抛出异常的行,并告诉我们错误消息是什么。那么也许我们可以帮忙...

- 迈克