- - PR -
エクセルのダウンロードについて
«前のページへ
1|2|3
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-05-02 11:38
動的に Excel ファイルを作成せず、常に固定の Excel ファイルをダウンロードすると何回でもうまくいくのでしょうか?
うまくいくのであれば、やはり動的に Excel ファイルを作成する箇所に問題があるような気がします。 | ||||||||||||
|
投稿日時: 2007-05-02 13:12
以下、すべて推測。
生成するファイル名が固定になっているため、 何度もテストすると、別プロセスがロックしているファイルに 検索結果をWriteしようとして失敗。 初回だけうまく行く(ことがある)のは、テスト環境をクリアにしたせいで Excelファイルを掴んでいるプロセスがないため。 サンプルからソースをコピペしているのでエラー処理が不適切になっており、 検索結果の書き込み処理が失敗した場合でも、無理やりファイルのダウンロードが 開始されてしまう。 なんでaspxのソースがダウンロード対象になるのかはソース読まないと分りません。 ひろれいさんがアドバイスされているように、 Excelファイルの生成処理を見直すのがいいんじゃないでしょうか。 スレ主の参考にしたと思われるページ http://www.microsoft.com/japan/msdn/asp.net/tips/download/ | ||||||||||||
|
投稿日時: 2007-05-02 14:02
いろいろと貰った意見の中でサーバ上のエクセルファイルが正しくできているのか、またクライアント先の環境はどうかという意見をもらい自分の方で確かめてみました。
まずは1回目はうまくいき2回目から失敗するという所から開放がちゃんと できているのかを疑い以下のコードを入れました。 ------------------------------------------------------------------------------- If Not mobjExlBook Is Nothing Then System.Runtime.InteropServices.Marshal.ReleaseComObject(mobjExlBook) mobjExlBook = Nothing End If If Not mobjExlSheet Is Nothing Then System.Runtime.InteropServices.Marshal.ReleaseComObject(mobjExlSheet) mobjExlSheet = Nothing End If mobjExlApp.Quit() If Not mobjExlApp Is Nothing Then System.Runtime.InteropServices.Marshal.ReleaseComObject(mobjExlApp) mobjExlApp = Nothing End If GC.Collect() ------------------------------------------------------------------------------- いままではQuitとnothingだけしかやっていませんでした。 上記のコードを入れてもう1度確認したところ2回目以降もできるようになりました。 これのおかげで本当にできたのかは微妙ですが取りあえずはOKとなりました。 ただし、ダメなPCもありました。 サーバー上ではexcel2000で作っているのですがクライアントに違うバージョン(Excel XPなど)だとダメなようです。 バージョンが違うのでダメということで現状は納得しています。(運用にあたってはどうするかをかんがえなくてはいけないが) 一応はこれでやっていこうと思います。 いろいろと意見をもらいなんとかなりそうです、ありがとうございました。 また、ダメになった場合には投稿させていただきます。 | ||||||||||||
|
投稿日時: 2007-05-02 14:19
この文章からでは何を追加したのか厳密には分かりませんが、 System.Runtime.InteropServices.Marshal クラスにある ReleaseComObject メソッドを追加したのだとすると、まだ解放もれがあるような気がしてなりません。 私の杞憂であればよいのですが。 参考までに、いつものじゃんぬさんのページを置いておきます。 | ||||||||||||
|
投稿日時: 2007-05-02 14:45
口を挟まずずっと見守っていましたが、やはり予想どおりの結末でしたか。 「COM の参照カウント」 の問題は過去ログに山のようにあります。
必ず GC.Collect メソッドを実行するのでしょうか? 参照カウントを正しくデクリメントすれば、GC.Collect メソッドは必要ありません。 コストも高いのでやめましょう。(せめて例外発生時などに限定しておくべきです)
複数形のオブジェクトとかですよね。 参照カウント法について周知していたとしても、私はこの方法をお勧めしません。 CLR は COM との相性は良くありませんので、敢えて .NET 側で処理するメリットはないです。 特に今回のような Web アプリケーションでは絶対に使わないで欲しいです。 COM と相性の良いテクノロジで処理すべきです。 たとえば、VBA マクロとか、VBScript などが挙げられるでしょう。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||
|
投稿日時: 2007-05-02 15:03
ですね。 予算的に許せば、ベンダー製品を導入するのも1つの手だと思います。 | ||||||||||||
|
投稿日時: 2007-05-02 15:30
「いつものじゃんぬさんのページ」を参照させてもらいました。
参考になりました。 >CLR は COM との相性は良くありませんので、敢えて .NET 側で処理するメリットはないです。 考えさせられました。 時間的制約もあるのですが検討したいと思います。 またGC.Collect() は保険的に使用をしましたがちゃんとした開放がされていればする必要はないですね。 例外のときのみ使用するように変更をしたいと思います。 |
«前のページへ
1|2|3