你使用Excel Interop时遇到的最烦人/最奇怪的事情是什么?

10

使用Excel Interop和.Net进行开发一段时间后,我越来越烦恼于发生的很多“奇怪的事情”,比如我之前发布的这个问题-My Problem
我明白这不是一个直接的问题,更像是经验的合作,但我认为了解人们最大的烦恼/奇怪的事情以及他们如何克服它们可能会有所帮助。
这样我就可以了解未来可能遇到的问题 :)

谢谢


+1,好问题;我很快会发布一些东西。 - Rubens Farias
7个回答

6
Excel交互最让我烦恼的功能是,每次你进行任何操作时,它都会在后台创建COM对象,但这些对象都需要处理,否则当你调用Close()方法关闭Excel时,它将无法关闭。如果你漏掉了其中一个,通常很难找到原因。
幸运的是,我在这里找到了一篇文章,提供了一些解决该问题的方法。

你可能也想阅读这个帖子:https://dev59.com/qnI95IYBdhLWcg3wsQP9 - Henrik

2

在不同的MS Office版本的机器上编译Interop会得到不同的结果。

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

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


2

因为打开了多个不同的Office应用程序实例而导致内存耗尽。

仔细编程可能会解决这个问题,但应用程序内部错误可能会破坏您的假设。


是的,我发现这个特别烦人。在编写应用程序和调试时(因此并不总是以正确的方式退出应用程序,因此无法调用正确的处理方法),我已经遇到过几次这种情况,并出现了幽灵进程。在这些情况下,PSKill.exe非常有帮助。 - Ben

2

奇怪的是所有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


0
我最烦人的事情是看起来出现了随机的错误/异常/崩溃。
例如,有时我需要从 C# 控制台应用程序将数千个工作簿在xls/xlsx格式之间进行转换。Excel 很少能够一次性处理完所有这些工作簿而不出错。多次运行会导致不同文件的问题。因此,如果我的文件集中包括 a.xls 和 b.xls,Excel 可能会在第一次通过时失败于 a.xls,在第二次通过时失败于 b.xls。
这台机器的内存/磁盘空间远远超过应用程序所需的。该应用程序是单线程的,因此不存在多个 Excel 实例创建混乱的问题。
我观察到这种行为发生在 Excel 2003 和 Excel 2007 上。
最终,我修改了我的应用程序来考虑这个事实,并跟踪已成功转换的工作簿,以便第二遍清理第一遍留下的混乱。

错误消息完全没有意义,完全违反了微软的错误消息编码标准。根据他们的“Microsoft用户体验交互指南” - “有效的错误消息通知用户发生了问题,解释为什么会发生这种情况,并提供解决方案,以便用户可以修复问题。” - Ben
@Ben 尝试使用SSIS Excel错误信息,相比于SSIS晦涩难懂的错误信息,简直就像是奇迹:) - Sergey Mirvoda

0

自动化支持的缺乏...

例如,在服务器上无法以自动化或非交互式环境运行Excel。虽然可以做到,但不可靠且需要对系统进行黑客攻击,这在产品环境中通常是不可行的。但这不仅限于Excel。

有关更多信息,请参见此处。我最近进行了一项研究,您可以在此处找到一些替代方案:作为服务器进程读取Excel文件

这给我和其他人带来了无数问题,我已经阅读了许多关于在服务器上使用Excel的Stackoverflow帖子。特别是自Vista及以上版本后,通过自动化无法使用Office 2k7,所以这条路真的不值得麻烦。


0

1 - 要从另一个线程向工作表写入数据,必须实现 IMessageFilter 接口,即使如此,仍然需要 用锤子敲打它

2 - 正如 Mark Byers 上面提到的那样,"一点规则"...哎...

3 - 当然,在任何清晰的地方都没有标记这些内容,所以我们不得不在网络的最黑暗的角落里搜寻,希望能够找到一些合理的解释...

(不过 Andrew Whitechapel 已经友善地撰写了 许多非常有用的文章 - 谢谢你,Andrew,只是有点遗憾你不得不...)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接