0

私は現在、Excel で実行されているアプリケーションの設計段階にあります。複雑な数学 (trigo、algebra など) の公式を含む科学アプリケーションです。最初はコードですべてを実行しようとしましたが、すぐに、これらの科学的な数式を .NET に変換するのは非常に面倒であることがわかりました (バグの可能性が高い)。

もう 1 つのオプションは、Excel スプレッドシートとそのセル式の一種の「テンプレート」を使用することです。このテンプレートでは、.NET のユーザー インターフェイスでユーザーがデータを入力できます。.NET (Web アプリ) はこの入力データを Excel スプレッドシートに渡し、Excel スプレッドシートが行います。 .NET アプリはこれを読み取り、ユーザーに表示します。(これは、提案された設計の簡単な説明です)。

その予定は Web アプリケーションです (公開サイトではありません)。

問題の 1 つ (私が考えた) は、複数のユーザーがアプリケーションを使用している場合に、Excel ファイルに複数のスレッドの読み取り/書き込みの問題が発生することです。これを克服するために、ファイルのコピーをSQLデータベースに保存することについてですが、セッションごとにGUID名(一意にするため)で一時フォルダーにコピーし、完了したらファイルなどを削除します.

私の質問は、この計画の欠陥や欠点、たとえば、パフォーマンス、Excel の読み取り/書き込みなど、私が考慮する必要があるものを見ている人はいますか? OpenXML と ClosedXML ライブラリを使用する予定です。これを機能させるには、展開サーバーに Office をインストールする必要がありますか? (私はそうは思わなかったでしょう)。

ありがとう、

4

3 に答える 3

2

個人的には、それが悪い考えだとは本当に思いません - 私は数百のスプレッドシートを生成するアプリケーションを作成し (さまざまなユーザー向けのいくつかのテンプレートに基づいて)、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 からの高速な読み取り/書き込みについては、オンラインで多くのリソースがあります。

于 2013-10-25T07:53:14.017 に答える
0

元の計画に固執するのは面倒かもしれませんが、Excel スプレッドシートを読み書きするよりも優れたソリューションです。

よく見れば、数式を Excel スプレッドシートから .Net アプリケーションに複製するための解決策が見つかると確信しています。また、それを学習曲線として扱うこともできます。

http://linqtocsv.codeplex.com/に出くわしたことがありますか

スプレッドシートを使い続けるつもりなら、これは有益かもしれませんが、.Net アプリケーションで SQL データベースを使用することは、より堅牢なシステムであり、複数のユーザーがデータにアクセスしようとする問題を解決します。Entity Framework または NHibernate も使用できます。

Excel は、複数のユーザーが同時にアクセスするようには設計されていません。後で多くの問題が発生することになると思います。

于 2013-10-25T07:40:11.597 に答える
0

サーバー上で Excel を自動化している場合は、問題がいっぱいになる可能性があります。Web ページが要求を送信するたびに、アプリの新しいインスタンスを開始し、そのアプリ インスタンスでブックのコピーを開くことができます。ハードウェアとシートのサイズに応じて、合理的な数のユーザーには問題ありません。

ロス

于 2013-11-02T12:03:02.013 に答える