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