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

ASP.NETにてエクセルをダウンロードする

1
投稿者投稿内容
みつん
大ベテラン
会議室デビュー日: 2004/05/21
投稿数: 100
投稿日時: 2005-05-19 18:52
いつもお世話になっております。

現在、ASP.NETを使用し、雛形のExcelをサーバ側でコピーしデータを貼り付け、
クライアントにてダウンロードしています。
以下、長くなりますがソースコードです。

--------------------------------------------------------
Excel.Application app;
Excel.Workbook book;
Excel.Worksheet sheet;

try
{
// エクセルオブジェクト生成
app = new Excel.Application();

// テンプレートをコピーし新規ブックを作成
book = (Excel.Workbook)app.Workbooks.Add("テンプレート.xls");
sheet = (Excel.Worksheet)book.Sheets["Sheet1"];
sheet.Cells[1,1]="テストです";

// テンポラリファイル作成
book.SaveCopyAs(tmpFileName);

FileInfo fileInfo = new System.IO.FileInfo(tmpFileName);
long nSize = fileInfo.Length;
string cvtFullPath = System.Web.HttpUtility.UrlEncode(tmpFileName);

Response.Clear();
Response.ContentEncoding = System.Text.Encoding.GetEncoding("shift-jis");
Response.AppendHeader("Content-Disposition", "attachment; filename="
+ "クライアント表示用ファイル名.xls" );
Response.WriteFile(tmpFileName, 0, nSize);
Marshal.ReleaseComObject(app);
Response.Flush();
Response.Close();

// テンポラリファイル削除
System.IO.File.Delete(tmpFileName);
System.GC.Collect();
Response.End();
}
catch(Exception e)
{
throw e;
}

----------------------------------------------------------
処理的にはダウンロードを促す画面が出て、正常にダウンロードできます。

ここで質問なのですが、
1.一行ずつデバックしていくと、最終的に最後の
  Response.End()で、Exception に入ってきます。
  メッセージは"スレッドを中止しようとしました"でした。
  お恥ずかしい質問ですが、これは正しい現象なのでしょうか?

2.ダウンロードを促すメッセージ画面でキャンセルを選択すると、
  Excelのプロセスが終了せず残ってしまいます。
  これを終了させる事は可能でしょうか?
  みなさんはどのように解決していますでしょうか?
  ここで解決できない場合は、この方法ではよろしくないということに
  なるのでしょうか?結構不安です・・・。

過去ログ等参考にここまでやってみましたがWebアプリは初心者ゆえ、
行き詰るとどうにもこうにもです。
どなたかご教授いただければ非常に助かります。
よろしくお願いいたします。
nodera
大ベテラン
会議室デビュー日: 2003/09/08
投稿数: 200
投稿日時: 2005-05-19 19:36
こんにちは。

1の回答
正常です。End()を呼び出すと、ThreadAbortExceptionが生成されます。詳しくはこちら。
http://www.microsoft.com/japan/msdn/library/ja/cpref/html/frlrfSystemWebHttpResponseClassEndTopic.asp?frame=true

2の回答
キャンセルしなかった場合は、Excelのプロセスは終了しているのでしょうか?
appだけでなく、参照したCOMオブジェクト(Sheetやcell等)は全て解放する必要があります。
こちらが参考になるかな。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=13903&forum=7
みつん
大ベテラン
会議室デビュー日: 2004/05/21
投稿数: 100
投稿日時: 2005-05-19 20:04
noderaさん、早速のレスありがとうございます。

参考スレッドにて修正を行い、無事プロセス開放できました。

変更箇所は以下です。
-------------------------------------------------
// 各オブジェクトの開放を追加
Marshal.ReleaseComObject(sheet);
Marshal.ReleaseComObject(book);
Marshal.ReleaseComObject(app);

VBでいうところの
app = Nothing
は、c#では無視してよいのでしょうかね?
ともかく、プロセスが消えて安心です。
非常に助かりました。
本当にありがとうございました。

1

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