- PR -

エクセルのダウンロードについて

投稿者投稿内容
ひろれい
ぬし
会議室デビュー日: 2006/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2007-05-02 11:38
動的に Excel ファイルを作成せず、常に固定の Excel ファイルをダウンロードすると何回でもうまくいくのでしょうか?

うまくいくのであれば、やはり動的に Excel ファイルを作成する箇所に問題があるような気がします。
あじぇ
会議室デビュー日: 2006/11/28
投稿数: 5
投稿日時: 2007-05-02 13:12
以下、すべて推測。

生成するファイル名が固定になっているため、
何度もテストすると、別プロセスがロックしているファイルに
検索結果をWriteしようとして失敗。
初回だけうまく行く(ことがある)のは、テスト環境をクリアにしたせいで
Excelファイルを掴んでいるプロセスがないため。

サンプルからソースをコピペしているのでエラー処理が不適切になっており、
検索結果の書き込み処理が失敗した場合でも、無理やりファイルのダウンロードが
開始されてしまう。
なんでaspxのソースがダウンロード対象になるのかはソース読まないと分りません。

ひろれいさんがアドバイスされているように、
Excelファイルの生成処理を見直すのがいいんじゃないでしょうか。


スレ主の参考にしたと思われるページ
http://www.microsoft.com/japan/msdn/asp.net/tips/download/
ニック
会議室デビュー日: 2007/05/01
投稿数: 12
投稿日時: 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など)だとダメなようです。 バージョンが違うのでダメということで現状は納得しています。(運用にあたってはどうするかをかんがえなくてはいけないが)
一応はこれでやっていこうと思います。
いろいろと意見をもらいなんとかなりそうです、ありがとうございました。
また、ダメになった場合には投稿させていただきます。
ひろれい
ぬし
会議室デビュー日: 2006/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2007-05-02 14:19
引用:

ニックさんの書き込み (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回目以降もできるようになりました。



この文章からでは何を追加したのか厳密には分かりませんが、
System.Runtime.InteropServices.Marshal クラスにある ReleaseComObject メソッドを追加したのだとすると、まだ解放もれがあるような気がしてなりません。
私の杞憂であればよいのですが。

参考までに、いつものじゃんぬさんのページを置いておきます。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-05-02 14:45
引用:

ニックさんの書き込み (2007-05-02 14:02) より:

System.Runtime.InteropServices.Marshal.ReleaseComObject(mobjExlBook)
System.Runtime.InteropServices.Marshal.ReleaseComObject(mobjExlSheet)
System.Runtime.InteropServices.Marshal.ReleaseComObject(mobjExlApp)


口を挟まずずっと見守っていましたが、やはり予想どおりの結末でしたか。
「COM の参照カウント」 の問題は過去ログに山のようにあります。

引用:

GC.Collect()


必ず GC.Collect メソッドを実行するのでしょうか?
参照カウントを正しくデクリメントすれば、GC.Collect メソッドは必要ありません。
コストも高いのでやめましょう。(せめて例外発生時などに限定しておくべきです)

引用:

ひろれいさんの書き込み (2007-05-02 14:19) より:

この文章からでは何を追加したのか厳密には分かりませんが、System.Runtime.InteropServices.Marshal クラスにある ReleaseComObject メソッドを追加したのだとすると、まだ解放もれがあるような気がしてなりません。


複数形のオブジェクトとかですよね。

参照カウント法について周知していたとしても、私はこの方法をお勧めしません。
CLR は COM との相性は良くありませんので、敢えて .NET 側で処理するメリットはないです。
特に今回のような Web アプリケーションでは絶対に使わないで欲しいです。

COM と相性の良いテクノロジで処理すべきです。
たとえば、VBA マクロとか、VBScript などが挙げられるでしょう。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ひろれい
ぬし
会議室デビュー日: 2006/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2007-05-02 15:03
引用:

じゃんぬねっとさんの書き込み (2007-05-02 14:45) より:

参照カウント法について周知していたとしても、私はこの方法をお勧めしません。
CLR は COM との相性は良くありませんので、敢えて .NET 側で処理するメリットはないです。
特に今回のような Web アプリケーションでは絶対に使わないで欲しいです。



ですね。

予算的に許せば、ベンダー製品を導入するのも1つの手だと思います。
ニック
会議室デビュー日: 2007/05/01
投稿数: 12
投稿日時: 2007-05-02 15:30
「いつものじゃんぬさんのページ」を参照させてもらいました。
参考になりました。
>CLR は COM との相性は良くありませんので、敢えて .NET 側で処理するメリットはないです。
考えさせられました。 時間的制約もあるのですが検討したいと思います。

またGC.Collect() は保険的に使用をしましたがちゃんとした開放がされていればする必要はないですね。 例外のときのみ使用するように変更をしたいと思います。


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