有谁有从 .Net 应用程序控制多个 Excel 实例的好例子吗?
题
我们有一个基于 Excel 2002/XP 的应用程序,它与 SQL 2000/5 交互来处理相当复杂的精算计算。该应用程序可以很好地执行其功能,但难以管理。
我们正在尝试创建一个“控制器”应用程序或服务,可以管理和监视这些不同的 Excel 实例(启动/停止/处理命令等),但不幸的是,这有点像 InterOp 噩梦。
有没有人有好的(即工作)在 VB.Net 或 C# 中执行类似操作的示例?
解决方案
不要这样做!
我们花了数周的时间试图让类似的东西发挥作用,但它根本没有像广告中那样运行。甚至不要开始——立即放弃!
您真正拥有的唯一选择是基于重型服务器端 MOSS 的实现 - Excel (Web) 服务(他们称之为类似的东西)。基于 Windows 的 COM Excel 互操作性几乎已经消失,将被 MOSS 取代。
另一种选择是使用 SpreadsheetGear。它实际上是一个很棒的产品
- 速度非常快
- 该引擎与 UI 分离,因此您可以使用它在服务器端执行 Excel 操作(未安装 Office)
- 相当便宜
- 具有与现有 Excel COM api 类似的 API,因此移动代码相对容易
这完全取决于您电子表格中所需的公式。查看 Spreadsheet Gear 的公式列表,如果有匹配的就使用它。
其他提示
互操作工作正常,只是您最终总是会引用未释放的 Excel 对象,因此 Excel 实例不会关闭。以下知识库文章解释了原因:
http://support.microsoft.com/default.aspx/kb/317109/EN-US/
如果您为一组有限的互操作场景非常仔细地编写了代码,则可以避免该问题。但一般情况下很难让它可靠地工作。
您可能想看看这个产品: http://www.spreadsheetgear.com/products/spreadsheetgear.net.aspx
它们都是托管代码和直接 .NET 库。没有令人头疼的互操作问题。我自己没有使用过它,但我从金融界的人们那里听到了非常好的评价。
我们编写了一个控制 Excel 2003 的单个实例的服务。我们从未设法让 Excel 实例彻底关闭,因此我们在第一次访问服务时启动一个实例,并仅使用该实例,序列化客户端请求。