- - PR -
Excelオブジェクトの解放について
1
投稿者 | 投稿内容 | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-06-04 18:12
Excelオブジェクトの生成に苦労をしています。
今は、Webサーバーで生成したExcelファイルをダウンロードするソースをコンパイル したら、Response.WriteFile(strOutFileName)で落ちている。エラーはこのファイルは 別のプロセスで使用中です。 開発環境;VB.NET2003 Webアプリケーション ****ソース****** Private objApp As Excel.Application Private objWBook As Excel.Workbook Private objSheet As Excel.Worksheet strInFileName ="C:\wwwroot\bbb.xls" ' 元ファイル名 strOutFileName = "C:\wwwroot\aaa.xls" ' 出力ファイル名 '***** エクセルアプリケーションのインスタンスを作成 ***** objApp = CreateObject("Excel.Application") objWBook = m_appWork.Workbooks.Open(strInFileName) objSheet = m_wbkWork.Worksheets(1) objWBook.Cells(1,1).Value = 1 objWBook.Cells(1,2).Value = 1 objWBook.Cells(1,3).Value = 1 objWBook.SaveAs(strOutFileName) objSheet = Nothing objWBook = Nothing objApp = Nothing objApp.Quit() Response.Clear() Response.ContentType = "application/vnd.ms-excel" Response.Charset = "" Response.AddHeader("content-disposition", "attachment; filename=" + HttpUtility.UrlEncode(bbb.xls") Response.WriteFile(strOutFileName) Response.End() ******************* タスクマネージャーで見ると、Excel.exeが起動されている為、ダウンロード ができない。 どなたがご教授をお願いできますか? よろしくお願いします。 | ||||||||||||||||||||
|
投稿日時: 2006-06-04 19:47
COM の参照が解放されていないために、Excel のプロセスが居残っているのでしょう。 先ほど、類似スレッドが解決したのでご案内しておきます。 またまた EXCEL のプロセスについて
これ、おかしくないでしょうか? Workbooks などが暗黙的に参照されて、解放できないままでいることもそうですが、 objApp に対して Excel.Application のインスタンスを生成しているのに、 objApp ではなく、m_appWork からどうこうしようとしています。
すべて参照に取り、ReleaseComObject メソッドで参照カウントをデクリメントしましょう。 そうしないと、プロセスが終了せず居残ります。 以下のリンク先が参考になると思います。 COM オブジェクトを解放する _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||||||||||
|
投稿日時: 2006-06-04 20:59
じゃんぬねっと様
ご回答ありがとうございます。 以下のソースをコピーしたので、うっかり間違いました。 objApp = CreateObject("Excel.Application") objWBook = m_appWork.Workbooks.Open(strInFileName) objSheet = m_wbkWork.Worksheets(1) 正しいのはこれです。 objApp = CreateObject("Excel.Application") objWBook = objApp .Workbooks.Open(strInFileName) objSheet = m_objWBook .Worksheets(1) COMオブジェクトの解放について初めて知りました、 やってみます。 大変有難うございました。 | ||||||||||||||||||||
|
投稿日時: 2006-06-05 08:13
こちらも、ただの転記ミスかもしれませんが... Excel.Workbook も、違うインスタンスを使われているようです。
たとえば、
ここも、Excel.Workbooks が暗黙的に参照されています。
と Excel.Workbooks の参照を取り、
その参照から Workbook を取り出します。 あとは ReleaseComObject メソッドへ、参照したこの変数を すべて 渡して解放します。 これは、先ほどの Cells (Excel.Range) についても同様のことが言えます。 毎回、Cells を Excel.Range の変数に格納する必要があります。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||||||||||
|
投稿日時: 2006-06-05 10:35
余談ですが、リクエストを出すクライアントに Excel のライセンスが必要になりますので、その点には注意しておきましょう。イントラネットならともかく、インターネットでは実質的に、この技術は使用できません。また、技術的にも懸念項目が数多くあります。
Office のサーバーサイド オートメーションについて |
1