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

在使用.Net的Excel Interop开发一段时间后,我越来越讨厌有多less“奇怪的事情”发生 – 比如我之前发布的这个问题 – 我的问题 。
我很欣赏,这不是一个直接的问题,更多的是一个经验的合作,但是我认为,找出人们最大的烦恼/奇怪的事情,以及如何克服它们是有帮助的。
这样我可以找出什么问题,我可能遇到未来:)

谢谢

Excel互操作最令人讨厌的特点是每次你做任何事情都会在幕后创buildCOM对象,但是这些都需要处理,否则当你调用Close()时,Excel不会closures。 如果你错过了,往往很难弄清楚在哪里。

幸运的是,我在这里发现了这个线索 ,提出了一些解决问题的方法。

内存耗尽是因为许多Office应用程序打开不同的实例。

仔细的编程可能会将其整理出来,但应用程序中的内部错误可能会破坏您的假设。

您将得到一个不同的MS Office版本的机器上编译的不同的Interop。

这基本上意味着额外的机器(物理或虚拟)和额外的Visual Studio,Windows和MS Office许可证来开发额外的版本。

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

奇怪的是所有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版本都会在签名中添加一些参数,并彻底摧毁您的代码。

ref和out也是不可用的构造。
一个build议 – 使用VB.NET办公互操作 – 它是这样的事情的正确的工具,或等待C#4.0

对我来说最烦人的是你得到了看似随机的错误/exception/崩溃。

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

该机器具有比应用程序所需更多的内存/磁盘空间。 该应用程序是单线程的,所以不存在多个Excel实例创build混乱的问题。

我已经观察到Excel 2003和Excel 2007中的这种行为。

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

缺乏对自动化的支持

事实上,无法在自动或非交互式环境(例如在服务器上)中运行Excel。 它可以完成,但不是可靠的,而不是没有黑客的系统,这往往是不可行的产品环境。 但是这不仅限于Excel。

欲了解更多信息请点击这里 我做了一个最近的研究,你可以在这里find一些select: 读取Excel文件作为服务器进程

这已经导致了我和其他人的无数问题,并且我已经阅读了很多关于Stackoverflow的post,关于在服务器上使用Excel的所有问题。 这真的不值得走这条路线的麻烦,特别是因为Vista和以上根本不通过自动化与Office 2k7的工作。

1 – 从另一个线程写入表单的事实,你必须实现IMessageFilter ,即使是这样,你仍然必须用锤子敲打它

2 – 正如马克·拜尔斯在上面提到的那样, “一点规则” ……叹…

3 – 当然,没有任何明确的地方是这样标记的,所以我们必须拖networking的最黑暗的angular落,希望绊倒一些理由

(然而,安德鲁·怀特佩尔(Andrew Whitechapel)却非常友好地写了很多非常有帮助的文章 – 谢谢,安德鲁,只是可惜你不得不……)