使用Excel Interop和.Net进行开发一段时间后,我越来越烦恼于发生的很多“奇怪的事情”,比如我之前发布的这个问题-My Problem。
我明白这不是一个直接的问题,更像是经验的合作,但我认为了解人们最大的烦恼/奇怪的事情以及他们如何克服它们可能会有所帮助。
这样我就可以了解未来可能遇到的问题 :)
谢谢
在不同的MS Office版本的机器上编译Interop会得到不同的结果。
这基本上意味着需要额外的机器(物理或虚拟),以及额外的Visual Studio、Windows和MS Office许可证来为其他版本进行开发。
部署版本到客户端时,我曾经归档了一个虚拟机映像来编译该版本,因为我不能保证在我的开发机器上使用相同的MS Office版本。
因为打开了多个不同的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)
此外,签名也取决于Office Interop版本,每个主要的Excel版本都会向签名添加一些参数并完全破坏您的代码。
ref和out也是不可用的构造。
一个建议是使用VB.NET进行Office Interop - 这是正确的工具,或者等待c#4.0
自动化支持的缺乏...
例如,在服务器上无法以自动化或非交互式环境运行Excel。虽然可以做到,但不可靠且需要对系统进行黑客攻击,这在产品环境中通常是不可行的。但这不仅限于Excel。
有关更多信息,请参见此处。我最近进行了一项研究,您可以在此处找到一些替代方案:作为服务器进程读取Excel文件
这给我和其他人带来了无数问题,我已经阅读了许多关于在服务器上使用Excel的Stackoverflow帖子。特别是自Vista及以上版本后,通过自动化无法使用Office 2k7,所以这条路真的不值得麻烦。
1 - 要从另一个线程向工作表写入数据,必须实现 IMessageFilter 接口,即使如此,仍然需要 用锤子敲打它。
2 - 正如 Mark Byers 上面提到的那样,"一点规则"...哎...
3 - 当然,在任何清晰的地方都没有标记这些内容,所以我们不得不在网络的最黑暗的角落里搜寻,希望能够找到一些合理的解释...
(不过 Andrew Whitechapel 已经友善地撰写了 许多非常有用的文章 - 谢谢你,Andrew,只是有点遗憾你不得不...)