我写了一个应用程序,它只是在电子表格上做了基本的I / O.读入一堆单元格,进行一些排序,然后将输出转储回另一个电子表格。在我的机器上工作得很好。我安装了Office 2003。
当它在2007年的某个机器上运行时,它会发生轰炸,可能是由于Interop组件的不同版本。
我希望有人知道如何根据办公室版本动态更改装配装配的位置(从登记处轻松获取办公室版本)。
通过互联网的其余部分进行筛选,我没有看到任何迹象表明可能:(。我尝试安装2007 PIA,但是当我尝试添加参考时,他们不会出现,我不知道在哪里浏览它们(它们不在c:\ windows \ assemblies \;也许安装没有工作)。我是否必须安装2007年的机器才能在每次需要进行更新时构建?
答案 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。因此,您应该隔离抛出异常的行,并告诉我们错误消息是什么。那么也许我们可以帮忙...
- 迈克