使用Excel Interop时发生的最烦人/最奇怪的事情是什么?

时间:2010-02-04 10:55:35

标签: c# .net vb.net excel interop

使用Excel Interop与.Net开发一段时间之后,我越来越恼火于发生了多少“奇怪的事情” - 例如我之前发布的这个问题 - My Problem。 我理解这不是一个直接的问题,更多的是经验的结合,但我认为找到人们最大的烦恼/奇怪的事情以及他们如何克服它们将会有所帮助。
这样我就可以找出将来遇到的问题:)

由于

7 个答案:

答案 0 :(得分:6)

Excel互操作最烦人的功能是每次你做任何事情它会在幕后创建COM对象,但这些都需要处理,否则当你调用Close时Excel不会关闭( )。如果你错过了一个,通常很难弄明白。

幸运的是,我在这里找到了thread,提出了一些解决问题的方法。

答案 1 :(得分:2)

您将在具有不同MS Office版本的计算机上编译不同的Interop。

这基本上意味着要为其他版本开发额外的计算机(物理或虚拟)以及其他Visual Studio,Windows和MS Office许可证。

在将版本部署到客户端时,我必须归档虚拟机映像以编译该版本,因为我不能保证我将在我的开发机器上使用相同版本的MS Office。

答案 2 :(得分:2)

由于Office应用程序的许多打开的不同实例而导致内存耗尽。

仔细编程可能会对其进行排序,但应用程序中的内部错误可能会破坏您的假设。

答案 3 :(得分:2)

MOST 怪异是所有Office方法中的可选参数。对我来说,作为c#程序员,Missing.Value就像当然。

例如,SaveAs方法需要12个参数,并且只需要其中一个参数,并且最终得到类似

的代码
result.SaveAs('file',Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value)

签名也取决于办公室互操作版本,每个主要的Excel版本都会为签名添加一些参数并完全破坏您的代码。

参考并删除无法使用的结构 一个建议 - 使用VB.NET进行办公室互操作 - 这是适合这种事情的工具,或者等待c#4.0

答案 4 :(得分:0)

对我来说最烦人的事情是你看似偶然的错误/异常/崩溃。

例如,我有时需要在C#控制台应用程序的格式(xls / xlsx)之间转换大量数千个工作簿。 Excel很少会在没有错误的情况下一次处理所有这些工作簿。多次运行会导致不同文件出现问题。因此,如果a.xls和b.xls在我的文件集中,则Excel可能在第一次传递时在a.xls上失败,在第二次传递时在b.xls上失败。

该机器具有比应用程序需要更多的内存/磁盘空间。该应用程序是单线程的,因此不存在多个Excel实例造成破坏的问题。

我在Excel 2003和Excel 2007中观察到了这种行为。

我最终修改了我的应用程序以解释这个事实,并跟踪哪些工作簿已成功转换,以便第二遍可以清理第一遍传递的混乱。

答案 5 :(得分:0)

缺乏对自动化的支持......

您无法在自动或非交互式环境中运行Excel,例如在服务器上运行Excel。它可以完成,但不是可靠的,也不是没有黑客攻击系统,这通常对产品环境不可行。但这并不仅限于Excel。

有关详细信息,请参阅here。我最近研究了一些您可以在这里找到的替代方案:Reading Excel Files as a Server Process

这给我和其他人带来了无数问题,我在Stackoverflow上阅读了很多关于问题的帖子,都是关于在服务器上使用Excel的。这真的不值得走这条路的麻烦,特别是因为Vista及以上版本无法通过自动化与Office 2k7协同工作。

答案 6 :(得分:0)

1 - 要从另一个线程写入工作表,你必须实现IMessageFilter,即使这样,你仍然需要whack it with a hammer

2 - 正如Mark Byers上面提到的,"one dot rule" ......叹息......

3 - 当然,在任何明显的地方都没有任何明显的标志,所以我们必须拖网的最黑暗的角落,希望偶然发现一些理由 ......

(安德鲁·怀特查佩尔亲切地写了lots of extremely helpful articles - 谢谢,安德鲁,你只需要怜悯......)