就我个人而言,我并不认为这是一个坏主意——我做了一个应用程序,它生成了数百个电子表格(基于不同用户的一些模板),我使用 ActiveMQ 和 Spring.Net 服务总线来使其足够快——通常3 分钟生成 200 多个电子表格:
我有大约 5 台专用服务器将 excel 作为服务运行,前端应用程序只发送请求,不执行电子表格的创建/写入/读取过程。
我遇到的唯一问题是一个 excel 服务一次不能处理超过 10 张,否则它会以某种方式崩溃(即使现在也无法弄清楚为什么......)。
谈到安全性和审计,将请求(在您的情况下可能是客户端输入/电子表格实例)存储到数据库中也是一个好主意。
这只是我的经验。忘了提一下,我使用 Office Interop 而不是 OpenXML,现在我正在考虑采用 OpenXML。
---- 编辑 ------------- 避免使用多个实例的另一个选项是使用单线程单实例,一个简单的示例(在 vb.Net 中):
Public Class MyCalculator
Public Class ParamSet
Property Param1 As Double
Property Param2 As Long
' etc. & etc.
End Class
Public Class ResultSet
Property Output1 As Double
Property Output2 As Long
' etc. & etc.
End Class
Private Shared _instance As MyCalculator
Public Shared Function Calculate(params As ParamSet) As ResultSet
SyncLock _instance
Return _instance.DoWork(params)
End SyncLock
End Function
Shared Sub New()
_instance = New MyCalculator()
End Sub
Private Sub New()
' Start up excel instance
' Set UserControl = true - to make sure it won't be killed by the system automatically
' Hold the excel instance in a local variable
End Sub
Private Function DoWork(params As ParamSet) As ResultSet
' write the params to the excel sheet
' then read output you need from corresponding cell
' return it out as a result set
End Function
End Class
单例加上 SyncLock 将确保您拥有一个单一的 excel 实例,并相信它对您的情况来说足够快 - 它只能从 excel 工作表读取/写入,并且 excel 实例将保持在服务器上。
它的好处是您可以轻松地用任何其他方式替换 excel 计算,例如,您自己的实现。
当然,缺点是显而易见的:所有请求都将被一一处理,因为它是单线程的。但我相信它会足够快 - 慢速部分(excel启动)已被取出,现在只能从工作表中读写。关于excel的快速读/写,网上有很多资源