マクロを含むASP.netページを介してExcelシートを編集することはどのように可能ですか?Excelシートを開こうとしましたが、Excelを読み込むのではなく、ハングしているようです。マクロのないページでのテストは完全にうまく機能しますか?
2 に答える
免責事項:Excelの使用許諾契約がわかりません。また、サーバープロセスでExcelを使用することが違反しているかどうかもわかりません。これは、それを機能させる方法の純粋な技術的な説明です。読者は、使用許諾契約書をチェックして、許可されているかどうかを確認することをお勧めします。Officeのバージョンが異なれば、ライセンス契約も異なる場合があります。私はいくつかのフォーチュン100/500企業でこの方法を使用しましたが、彼らは気にしていないようでした。図に行きます。
このソリューションは機能しますが、いくつかの制限があり、実行するサーバーをかなり制御する必要があります。サーバーにも大量のメモリが必要です。
まず、サーバー上のすべてのOffice機能の完全なインストールを実行して、存在しない機能を使用しようとした場合にExcelが何かをインストールしようとしないようにします。
また、適切な権限を持つ専用のユーザーアカウントをサーバー上に作成する必要があります。私の場合、サーバーを制御し、このユーザーに管理者権限を付与したため、正確には何がわかりません。
ユーザーアカウントをお持ちの場合は、そのユーザーとしてログインし、Excel(できればすべてのOfficeアプリケーション)を少なくとも1回実行して、設定を作成できるようにする必要があります。
また、COMオブジェクトとして作成するときに、このユーザーアカウントで実行するようにExcelを構成する必要があります。このためには、サーバーのDCOM構成に移動し、新しいユーザーアカウントを使用するようLaunch and Activation Permissions
にオブジェクトを構成する必要があります。正しく覚えているかどうかはわかりませんが、この手順の後、Excelをインタラクティブユーザーとして実行するのは少し問題があったと思います。Excel.Application
デフォルトでは、Officeアプリケーションは画面にさまざまなメッセージ(警告、質問など)を表示しようとします。WebアプリケーションからOfficeアプリケーションを使用する場合、サーバー上で実行されるため、人間のユーザーが表示されないため、これらをオフにする必要があります。これらのメッセージを却下するために-Officeプログラムは、メッセージが却下されるのを待って、無期限に待機します。
(少なくとも)次のプロパティを設定する必要があります。
DisplayAlerts = false
AskToUpdateLinks = false
AlertBeforeOverwriting = false
Interactive = false
Visible = false
FeatureInstall = 0 'msoFeatureInstallNone
ExcelからのUIメッセージを無効にします。Excel 2010を使用している場合は、さらに多くのことがあるかもしれませんが、私はそれについてよく知りません。
マクロを含むExcelファイルがある場合は、Excelでマクロセキュリティを無効にする必要がある場合があります。これは、明らかな理由により、プログラムで実行することはできません。
Excelサービスにアクセスするには、実際にExcel参照を保持するマネージャーオブジェクトを実装します。ページコードが非常に複雑になり、適切にクリーンアップできない可能性があるため、Excel.Applicationオブジェクトをページに保持しようとしないでください。 。
Excel参照を保持するオブジェクトは、別のDLLまたはアウトプロセスサーバーである可能性があります。ただし、特定のスレッドでExcelのインスタンスを取得するときは、常に新しいExcelインスタンスを作成するようにする必要があります。デフォルトでは、すでに実行されているExcelインスタンスは他の要求も処理しますが、同じExcelインスタンスを複数のスレッド間で共有できないため、これは機能しません。IISの各要求処理スレッドには、独自のExcelインスタンスが必要です。インスタンスを共有すると、あらゆる種類の問題が発生します。これは、Excelの多くのインスタンスを実行するために、サーバーにかなりのメモリが必要になることを意味します。サーバーを制御していたので、これは私にとって問題ではありませんでした。
可能であれば、プロセス外(.exe)COMサーバーを作成してみてください。これにより、Excel参照を別のプロセスで保持できるようになります。in-proc(.dll)COMオブジェクトを使用して動作させることは可能ですが、アプリケーションプールにとってよりリスクが高くなります。Excelがクラッシュすると、アプリプールもクラッシュします。
.exeサーバーがある場合、いくつかの可能な方法でパラメーターを渡すことができます。
- マネージャにCOMオブジェクトをオブジェクト化し、パラメータをプロパティとして渡します。
- 起動時に、パラメーターをコマンドラインパラメーターとして.exeに渡します。
- テキスト/バイナリファイルでパラメータを渡します。コマンドラインでファイルの名前を渡します。
私はこれらすべてを使用し、COMオブジェクトオプションが最もクリーンであることがわかりました。
マネージャオブジェクトでは、次のガイドラインに従ってください。
- Excelを使用するすべての関数を
try..catch
ブロックにラップして、発生する可能性のある例外をキャプチャします。 Marshal.ReleaseComObject()
変数を呼び出して、null
必要がなくなったらすぐにに設定することにより、常にすべてのExcelオブジェクトを明示的に解放します。これらのオブジェクトを常にfinally
ブロックで解放して、Excelメソッドの呼び出しが失敗してもCOMオブジェクトがぶら下がらないようにします。- Excelの書式設定機能(ページヘッダー、余白など)を使用する場合は、プリンターをインストールし、Excelの実行に使用するユーザーアカウントにアクセスできるようにする必要があります。アクティブなプリンタ(できればサーバーに接続されている)がない場合、フォーマット関連の機能が機能しない可能性があります。
- エラーが発生した場合は、使用しているExcelインスタンスを閉じてください。Excel関連のエラーから回復できる可能性は低く、インスタンスを長く保持するほど、リソースの使用時間が長くなります。
- Excelを終了するときは、再帰呼び出しからそのコードを保護するようにしてください。コードが既にExcelをシャットダウンしているときに、例外ハンドラーがExcelをシャットダウンしようとすると、Excelインスタンスが停止します。
- メソッドを呼び出した直後に呼び出して
GC.Collect()
、.NETFrameworkがすべてのExcelCOMオブジェクトをすぐに解放することを確認します。GC.WaitForPendingFinalizers()
Application.Quit()
編集:ジョン・サンダースはライセンス契約に関してポイントを持っているかもしれません-私はそれについてアドバイスすることはできません。私がWord/Excelを使用して行ったプロジェクトは、すべて大規模なクライアントのイントラネットアプリケーションであり、Word/Excelを使用する必要がありました。
彼が提供したリンクには、便利なツールもいくつかありますが、これらのライブラリには完全なExcel機能がなく、それが必要な場合は、選択の余地がありません。完全なExcel機能が必要ない場合は、これらのライブラリを確認してください。使用する方がはるかに簡単な場合があります。
このアプローチを実装しようとしている人々に役立つ可能性のあるいくつかのリンク:
話は少し前に、HPC ServicesforExcelで変わりました。
これにより、Webサーバー上でOfficeオートメーションを実行できます。私はまだそれが私の状況にどのように適合するかを決定しようとしていますが、あなたはそれをチェックしたいかもしれません。