使用Excel Interop的C#应用​​程序,2003年2007年之间轻松切换?

我有一个应用程序,只是在电子表格上完成基本的I / O操作。 读入一堆单元格,进行一些sorting,然后将输出转储回另一个电子表格。 在我的机器上效果很好。 我有Office 2003安装。

当它在2007年运行在别人机器上时,可能是由于Interop程序集的不同版本而导致的。

我希望有人知道一种方法来dynamic更改程序集加载哪些/取决于办公室版本(从registry获得办公室版本很容易)。

筛选通过互联网的其余部分,我没有看到任何东西表明可能:(我试图安装2007 PIA,但是当我尝试添加引用,他们没有出现,我不知道在哪里浏览他们(它们不在c:\ windows \ assemblies \中;也许安装不起作用)。我将不得不安装2007安装的计算机,以便每次需要更新时进行构build?

看看我的项目MS Office的.NET 。

它是一组托pipe的程序集,其中包含使用后期绑定和dynamic加载的COM对象在VB.NET中编写的包装types。 它适用于97-2007版本。 没有PIA要求。

我保存了对象模型,所以大多数VSTO样本应该只做很less的改变。

我希望,这有帮助。

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

当它在2007年运行在别人机器上时,可能是由于Interop程序集的不同版本而导致的。

我知道这样可能“感觉到”,但这种情况不太可能。 Excel 2007 PIA比2003 PIA更广泛,而不是更窄。 可能会添加types,成员和可选参数,但较旧的2003年签名将保持不变。 因此,无论是通过2003年的PIA还是2007年的PIA,2003年的所有来电都将以相同的方式进行。 这当然不是100.00%的保证,但是可能在99.8%左右,是我的猜测。

我希望有人知道一种方法来dynamic更改程序集加载哪些/取决于办公室版本(从registry获得办公室版本很容易)。

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

但为什么呢? 你将如何解决?

Excel 2003和Excel 2007对象模型之间的兼容性问题很less,但也有一些。 一个例子是Range.Cells.Count属性,它返回一个最大值为+4.3 bil的Int32。 (约)。 但是,在Excel 2007中引入了更大的工作表之后,电子表格上的单元格数量实际上大约为17.2亿个。 因此,如果Range太大(例如,包含整个工作表),则Range.Cells.Count将引发exception。 相反,你必须调用Range.Cells.CountLarge ,因为它返回一个Int64,可以处理更大的结果。

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

迈克

Interesting Posts