個人的には、それが悪い考えだとは本当に思いません - 私は数百のスプレッドシートを生成するアプリケーションを作成し (さまざまなユーザー向けのいくつかのテンプレートに基づいて)、ActiveMQ と Spring.Net サービス バスを使用してそれを十分に高速化しました - 一般的に200 を超えるスプレッドシートを生成するのに 3 分:
Excel as Service を実行している約 5 つの専用サーバーがあり、フロントエンド アプリケーションは要求を送信するだけで、スプレッドシートの作成/書き込み/読み取りプロセスは実行しません。
私が抱えていた唯一の問題は、1 つの Excel サービスが一度に 10 枚以上のシートを処理できないことです。
セキュリティと監査について言えば、リクエスト(あなたの場合はクライアント入力/スプレッドシートインスタンス)をデータベースに保存することもお勧めです。
それは私の経験です。言い忘れていましたが、私は OpenXML の代わりに Office Interop を使用していましたが、今は OpenXML を採用することを考えています。
---- EDIT ------------- 複数のインスタンスの使用を避けるための別のオプションは、単一のスレッド化された単一インスタンスを使用することです。簡単な例 (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 のインスタンスが 1 つだけになり、ケースに対して十分に高速であることが保証されます。Excel シートからのみ読み取り/書き込みが行われ、Excel インスタンスはサーバー上でライブ状態に保たれます。
また、Excel の計算を他の手段 (独自の実装など) に簡単に置き換えることができるという利点があります。
もちろん、欠点は明らかです。シングル スレッドであるため、すべての要求が 1 つずつ処理されます。しかし、私はそれが十分に速いと信じています-遅い部分(Excelの起動)が取り除かれ、シートからの読み書きのみになりました。Excel からの高速な読み取り/書き込みについては、オンラインで多くのリソースがあります。