- - PR -
ASP.NETにてエクセルをダウンロードする
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 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アプリは初心者ゆえ、 行き詰るとどうにもこうにもです。 どなたかご教授いただければ非常に助かります。 よろしくお願いいたします。 |
|
投稿日時: 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 |
|
投稿日時: 2005-05-19 20:04
noderaさん、早速のレスありがとうございます。
参考スレッドにて修正を行い、無事プロセス開放できました。 変更箇所は以下です。 ------------------------------------------------- // 各オブジェクトの開放を追加 Marshal.ReleaseComObject(sheet); Marshal.ReleaseComObject(book); Marshal.ReleaseComObject(app); VBでいうところの app = Nothing は、c#では無視してよいのでしょうかね? ともかく、プロセスが消えて安心です。 非常に助かりました。 本当にありがとうございました。 |
1