@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

ASP.NETでのEXCEL.APPLICATION使用について

1
投稿者投稿内容
オイル
会議室デビュー日: 2004/03/01
投稿数: 6
投稿日時: 2007-10-16 01:26
おせわになります。裏技の様になってしまうのかもしれませんが、教えて下さい。

Visualstudio.NET2003にてVB.NET、ASP.NETにて開発しているシステムで、
Excel2000をインストールし、ソース上で「Dim oExcel As New Excel.Application」
などとコーディングし、Excel帳票をサーバ上で編集し、クライアントにダウンロードして
表示しています。通常であれば全く問題なく動作するのですが、全く同時にクライアントから
EXCEL帳票起動の2つのリクエストが来た場合に、サーバ上にExcel.exeが2つ立ち上がる
んですが、1方のExcel編集内容は2つExcelの内容が混ざっている様になってしまい、1方のExcelはゾンビの様に動作しなくなってしまう場合があります。
これを回避する方法はないでしょうか?サーバはWin2000SVです。
マイクロソフトがサポートしていない事は知っています(http://support.microsoft.com/kb/257757/ja)が、
沢山のお客様に展開して2年以上経過してしまったため、最小限の修正で乗り切りたいと考えております。
何卒、お力をお貸し下さい。

ちなみに、以下と似た症状なのですが、この方の解決方法はちょっとわかりません。(解決していないのではないかと思います)
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=7155&forum=7

[ メッセージ編集済み 編集者: オイル 編集日時 2007-10-16 01:28 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-10-16 01:35
同じ Excel Workbook を使っているからではないでしょうか。(この時点で例外が発生しそうですが) コピーしてから使用するかあるいはファイル ロックを実装すれば理屈ではうまくいくと思います。

# サーバ サイドでの Excel Application のご利用は技術上とライセンス上の問題がありますのでご注意ください。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2007-10-16 03:07
引用:

マイクロソフトがサポートしていない事は知っています(http://support.microsoft.com/kb/257757/ja)が、


内容を見ればわかると思いますが、
サーバーで使うにはダメダメな実装です。

引用:

同じ Excel Workbook を使っているからではないでしょうか。(この時点で例外が発生しそうですが) コピーしてから使用するかあるいはファイル ロックを実装すれば理屈ではうまくいくと思います。


先のkbを読む限り、違うWorkbookを使っても、
理論上ダメな場合が多々あるように思います。

あまりにダメですが、どうしてもと言うなら、
私でしたら、グローバルなMutexを使って、
一度に一つのインスタンスしか起動しないようにします。
一番安全で確実に動く方法ではないかと思います。

もちろん、サーバーとして間違った実装ですので、
パフォーマンスは激しく悪くなります。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-10-16 21:53
参照先のスレッドで、ちらっと書いていますが、
*起動中の Excel オブジェクトを捕まえたり、
 > Dim oExcel As New Excel.Application
 「New してるじゃないか」といわれても、このあとで再設定
 しているコードを頻繁に見かけるので、有効かどうかわからない。
*Module など、複数のユーザが共有するものを使ったり、
*プロセスの偽装を行っていたり、
ということをしていると、ちょっとね。


> 1方のExcelはゾンビの様に動作しなくなってしまう場合があります。
 「場合がある」ってのが、気になりますね。
 ご存じのように、デバッグを行うには、どのような状況になっているかを把握する必要があります。まず、現象を正確に把握する必要があると思います。


 一応、複数の人が同時にアクセスしても大丈夫なように作ってあります。
チラッと書いてありますが、私は xls を読み込ませるのではなく、xslt を読み込ませて、複数のワークブックができるようにしました。


> 沢山のお客様に展開して2年以上経過してしまったため
 じゃんぬさんが書かれていますが、ライセンスは、本当に大丈夫ですか?
 オイルさんのお客さんのところで、オイルさんが提供したシステムを使うすべての端末に Excel がインストールされていなければ、ライセンス違反になります。
 もちろん、オイルさんが気をつけることではなく、オイルさんのお客さんが気をつけることですけど。なので読み流してね。
オイル
会議室デビュー日: 2004/03/01
投稿数: 6
投稿日時: 2007-10-17 22:25
じゃんぬねっと様、れい様、Jitta様、返答ありがとうございます。

> 同じ Excel Workbook を使っているからではないでしょうか

上記ですが、ExcelWorkbookは雛型をコピーして、ファイル名をユニークなシーケンス番号にしていますので問題はないと考えます。

> グローバルなMutexを使って、一度に一つのインスタンスしか起動しないようにします。

上記ですが、非常に参考になりそうです。ありがとうございます。
ただし、Excelのプロセスが何かの拍子にハングした時に、ずっと使用できなくなってしまうのが怖いです。
この回復のため、ReleaseMutexメソッドを実行するだけのアプリケーションをサーバ側に
作成しておき、もしハング状態になったら、それをダブルクリックしてMutexを開放する
様な運用を考える必要があるかと思いますが、この問題について、どの様に考えられますか?
(それとも、考える必要がないでしょうか?)
(参考URL: http://dobon.net/vb/melma/dotnet22.txt)

> もちろん、サーバーとして間違った実装ですので、 パフォーマンスは激しく悪くなります。

上記ですが、具体的にどの様な事でしょうか?Mutexを使うと、メモリを大量に使ったりするのでしょうか?

> 「場合がある」ってのが、気になりますね。

上記ですが、2台のPCで、「せーの」で実行すると、コンマ?秒の差で
当現象が発生する時としない時があるからです。
まったく同時に実行できれば、現象は100%発生します。

> xslt を読み込ませて、複数のワークブックができるようにしました。

上記ですが、これは、xmlを使用して、Excelのインスタンスは使用しない、という意味でしょうか?お手数ですが、どの様な事なのか教えていただけないでしょうか?

> ライセンスは、本当に大丈夫ですか?

全ての端末にExcelがインストール(ライセンス有り)されているので、問題ありません。

以上、お手数ですが、再度お力をお貸しください。よろしくお願いします。
オイル
会議室デビュー日: 2004/03/01
投稿数: 6
投稿日時: 2007-10-17 22:34
すいません。追記し忘れました。
解決の方法ですが、一番良いものは「複数のExcelインスタンスがサーバ上で同時に立ち上がっても、それぞれのExcelを正しく編集する事が出来る方法を考える」だと思っております。
上記の方法は、もう不可能だと考えた方がいいのでしょうか?
そうであれば、「複数のExcelインスタンスがサーバ上で同時に立ち上がらない様にする」という方針しかなく、Mutex等を検討していく事になるかと考えます。

以上、恐れ入りますが、皆様のお力をお貸しください。よろしくお願いします。
れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2007-10-17 23:14
引用:

オイルさんの書き込み (2007-10-17 22:25) より:
> グローバルなMutexを使って、一度に一つのインスタンスしか起動しないようにします。

上記ですが、非常に参考になりそうです。ありがとうございます。
ただし、Excelのプロセスが何かの拍子にハングした時に、ずっと使用できなくなってしまうのが怖いです。



それはいくらでも対応策があります。
一般的にはタイムアウトを設定するのがよいと思います。

引用:

上記ですが、具体的にどの様な事でしょうか?Mutexを使うと、メモリを大量に使ったりするのでしょうか?



Excelへのアクセスが排他処理されるので、待ちが発生します。
同時アクセスがあるとレスポンスが悪くなります。
また、Mutex一個分のハンドル消費があります。

引用:

解決の方法ですが、一番良いものは「複数のExcelインスタンスがサーバ上で同時に立ち上がっても、それぞれのExcelを正しく編集する事が出来る方法を考える」だと思っております。
上記の方法は、もう不可能だと考えた方がいいのでしょうか?



http://support.microsoft.com/kb/257757/ja
をよく読んでください。
>3. 再入可能性とスケーラビリティ
に書かれています。
ここには、対応策も書かれています。
私のいった排他実行のほかに、プール処理の方法も書かれています。
1

スキルアップ/キャリアアップ(JOB@IT)