C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: ASP.NET EXCELが開放されない


(過去ログ 75 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■44515 / inTopicNo.1)  ASP.NET EXCELが開放されない
  
□投稿者/ ひろと (1回)-(2009/12/10(Thu) 18:25:36)

分類:[ASP.NET (VB)] 

はじめまして。EXCELが開放されなくて困っています。
色々なサイトを見て調べましたが原因がわかりません。
どなたかご教授お願いします。
以下ソース      

        Dim Script As String
        Dim oExcel As New Excel.Application
        'WorkBookオブジェクト
        Dim oBook As Excel.Workbook
        Dim oBooks As Excel.Workbooks
        Dim oSheet As Excel.Worksheet
        Dim xlRange As Excel.Range

       

        If FileUpload.HasFile = False Then
            Exit Sub
        End If

        Try
            If Path.GetExtension(FileUpload.FileName) = ".xls" Or _
                   Path.GetExtension(FileUpload.FileName) = ".Xls" Then

                'Excelを非表示にする
                oExcel.Application.Visible = False

                'エクセルのファイル名
                oBooks = oExcel.Workbooks
                oBook = oBooks.Open(FileUpload.PostedFile.FileName)
                oSheet = oBook.Worksheets(1)
                xlRange = oSheet.Cells


                txtJyuchuSaki.Text = xlRange.Range("E19").Value
                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange)
                xlRange = oSheet.Cells
                txtJyuchuSaki.Text &= xlRange.Range("F19").Value
                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange)
                xlRange = oSheet.Cells
                txtJyuchuSaki.Text &= xlRange.Range("G19").Value
                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange)
                xlRange = oSheet.Cells
                txtJyuchuSaki.Text &= xlRange.Range("H19").Value
                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange)
                xlRange = oSheet.Cells
                txtKoujiMei.Text = xlRange.Range("E21").Value
                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange)
                xlRange = oSheet.Cells
                txtKoujiBasyo.Text = xlRange.Range("E22").Value
                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange)
                xlRange = oSheet.Cells
                txtKouki_S.Text = xlRange.Range("E27").Value & "/"
                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange)
                xlRange = oSheet.Cells
                txtKouki_S.Text &= xlRange.Range("G27").Value
                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange)
                xlRange = oSheet.Cells
                txtKouki_S.Text &= xlRange.Range("H27").Value & "/"
                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange)
                xlRange = oSheet.Cells
                txtKouki_S.Text &= xlRange.Range("I27").Value
                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange)
                xlRange = oSheet.Cells
                txtKouki_S.Text &= xlRange.Range("J27").Value
                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange)



                xlRange = oSheet.Cells
                txtKouki_E.Text = xlRange.Range("L27").Value & "/"
                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange)
                xlRange = oSheet.Cells
                txtKouki_E.Text &= xlRange.Range("N27").Value
                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange)
                xlRange = oSheet.Cells
                txtKouki_E.Text &= xlRange.Range("O27").Value & "/"
                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange)
                xlRange = oSheet.Cells
                txtKouki_E.Text &= xlRange.Range("P27").Value
                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange)
                xlRange = oSheet.Cells
                txtKouki_E.Text &= xlRange.Range("Q27").Value
                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange)
                xlRange = oSheet.Cells
                txtJyuChuKin.Text = ConvDec(xlRange.Range("E28").Value).ToString("#,##0")
                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange)
                xlRange = oSheet.Cells
                txtJyuChuGenka.Text = ConvDec(xlRange.Range("E29").Value).ToString("#,##0")
                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange)
                xlRange = oSheet.Cells
                txtYoteiGenka.Text = ConvDec(xlRange.Range("E30").Value).ToString("#,##0")
                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange)
                xlRange = oSheet.Cells
                txtSyohizei.Text = ConvDec(xlRange.Range("R28").Value).ToString("#,##0")
                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange)
                xlRange = oSheet.Cells
                txtMituMoriNo.Text = xlRange.Range("AE28").Value
                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange)
                xlRange = oSheet.Cells
                txtZairyo.Text = ConvDec(xlRange.Range("E31").Value).ToString("#,##0")
                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange)
                xlRange = oSheet.Cells
                txtGaichuHi.Text = ConvDec(xlRange.Range("E33").Value).ToString("#,##0")
                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange)
                xlRange = oSheet.Cells
                txtRoumuHi.Text = ConvDec(xlRange.Range("E34").Value).ToString("#,##0")
                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange)
                xlRange = oSheet.Cells
                txtKeihi.Text = ConvDec(xlRange.Range("E35").Value).ToString("#,##0")
                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange)
                xlRange = oSheet.Cells
                txtBF.Text = xlRange.Range("E41").Value
                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange)
                xlRange = oSheet.Cells
                txtBF.Text &= xlRange.Range("F41").Value
                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange)
                xlRange = oSheet.Cells
                txtF.Text = xlRange.Range("G41").Value
                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange)
                xlRange = oSheet.Cells
                txtF.Text &= xlRange.Range("H41").Value
                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange)
                xlRange = oSheet.Cells
                txtRF.Text = xlRange.Range("I41").Value
                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange)
                xlRange = oSheet.Cells
                txtRF.Text &= xlRange.Range("J41").Value
                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange)
                xlRange = oSheet.Cells
                txtTatemono.Text = ConvDec(xlRange.Range("E42").Value).ToString("#,##0")
                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange)

                lblView()
            Else
                Script = "<script language=javascript>" + "window.alert('EXCELファイルではありません。')" + "</script>"
                Response.Write(Script)
            End If
        Catch ex As Exception

        Finally
            If Not (xlRange Is Nothing) Then
                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange)
                xlRange = Nothing
            End If

            If Not (oSheet Is Nothing) Then
                System.Runtime.InteropServices.Marshal.ReleaseComObject(oSheet)
                oSheet = Nothing
            End If

            If Not (oBook Is Nothing) Then
                oBook.Close()
                System.Runtime.InteropServices.Marshal.ReleaseComObject(oBook)
                oBook = Nothing
            End If

            If Not (oBooks Is Nothing) Then
                oBooks.Close()
                System.Runtime.InteropServices.Marshal.ReleaseComObject(oBooks)
                oBooks = Nothing
            End If

         
            If Not (oExcel Is Nothing) Then

                oExcel.Quit()
                System.Runtime.InteropServices.Marshal.ReleaseComObject(oExcel)
                oExcel = Nothing
            End If
         
            GC.Collect()
        End Try
   
    End Sub

引用返信 編集キー/
■44516 / inTopicNo.2)  Re[1]: ASP.NET EXCELが開放されない
□投稿者/ Jitta on the way (487回)-(2009/12/10(Thu) 19:28:38)
No44515 (ひろと さん) に返信
> 'Excelを非表示にする

サーバーで動くのだから、無意味

> oSheet = oBook.Worksheets(1)

Worksheets が解放されてなさそう。
引用返信 編集キー/
■44517 / inTopicNo.3)  Re[1]: ASP.NET EXCELが開放されない
□投稿者/ 魔界の仮面弁士 (1413回)-(2009/12/10(Thu) 20:20:02)
No44515 (ひろと さん) に返信
> はじめまして。EXCELが開放されなくて困っています。
ASP.NET から利用する場合、そのサイトを利用するクライアント側にも、
Excel 本体が必要になりますが、その点は大丈夫ですか?
(ライセンス上の理由です。技術的にはクライアント側には無くても動作します。)


> どなたかご教授お願いします。
Excel を ASP や ASP.NET から利用する事には、多数の問題がありますが、
その事については理解されておられますでしょうか。
http://support.microsoft.com/kb/257757/ja


> Dim oBooks As Excel.Workbooks
> Dim oSheet As Excel.Worksheet
> Dim xlRange As Excel.Range
接頭辞 o と接頭辞 xl が、どのように使い分けされているのか気になります…。


>             If Path.GetExtension(FileUpload.FileName) = ".xls" Or _
>                    Path.GetExtension(FileUpload.FileName) = ".Xls" Then
「.XLS」や「.xlS」や「.XLs」や「.XlS」などは無視ですか?


>                 oSheet = oBook.Worksheets(1)
Jitta さんが指摘されていますが、Worksheets についても、
 Dim oSheets As Sheets = oBook.Worksheets
 oSheet = DirectCast(oSheets(1), Excel.Worksheet)
などのように、一度変数に受けて、最後に解放してください。


> xlRange = oSheet.Cells
> txtJyuchuSaki.Text = xlRange.Range("E19").Value
これもNG。Range オブジェクトの参照を残していますので、
 Dim oRange As Excel
 oRange = xlRange.Range("E19")
 txtJyuchuSaki.Text = oRange.Value
 Marshal.ReleaseComObject(oRange)
のようにして、途中の Range オブジェクトも処理してください。


> System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange)
> xlRange = oSheet.Cells
xlRange には、既に oSheet.Cells が入っていますので、この 2 行は不要です。


> txtJyuchuSaki.Text &= xlRange.Range("F19").Value
これは NG。
先述したように、xlRange.Range("F19") が返す Range オブジェクトも解放対象です。


> System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange)
> xlRange = oSheet.Cells
先ほどと同様。
xlRange には、既に oSheet.Cells が入っていますので、この 2 行は不要です。


> txtJyuchuSaki.Text &= xlRange.Range("G19").Value
同じく、解放漏れ。


> System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange)
> xlRange = oSheet.Cells
同じく、不要。

以下同様なコードが続くので指摘省略。


> txtTatemono.Text = ConvDec(xlRange.Range("E42").Value).ToString("#,##0")
これらも、xlRange.Range("E42") が返す Range を変数に受けるとして…

> System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange)
ここが微妙。

確かに、ここより後では xlRange が使われないのですが、そもそも、
この直後に Finally 句にて解放コードが記載されているため、不要では無いかと。

ここで xlRange を解放すると、参照カウントが 0 になった xlRange が、
Finally にてさらに解放されることになりかねません。


>     lblView()
内容が不明ですが、この中では Excel を操作してはいないのですね?


> Else
>     Script = "<script language=javascript>" + "window.alert('EXCELファイルではありません。')" + "</script>"
>     Response.Write(Script)
> End If
ここまでは「& 演算子」で文字列連結しているのに、
何故ここでは「+ 演算子」で文字列連結しているのでしょうか?

別に「+」のままでも問題はありませんが、表記法がぶれるのは好ましくないので、ここは
 Script = "<script language=javascript>" & "window.alert('EXCELファイルではありません。')" & "</script>"
もしくは単に、
 Script = "<script language=javascript>window.alert('EXCELファイルではありません。')</script>"
などと記述する事をおすすめします。


> Catch ex As Exception
Exception を単に握りつぶす事は避けた方が良いかと。

ユーザーにエラーを見せたくないにしても、せめてログには残しましょう。
何か問題が発生したとき、それを後から追跡できなくなりますよ。
http://blogs.msdn.com/nakama/archive/2009/01/18/net-part-3.aspx

引用返信 編集キー/
■44550 / inTopicNo.4)  Re[2]: ASP.NET EXCELが開放されない
□投稿者/ ひろと (1回)-(2009/12/11(Fri) 17:15:58)
No44517 (魔界の仮面弁士 さん) に返信
> ■No44515 (ひろと さん) に返信
>>はじめまして。EXCELが開放されなくて困っています。
> ASP.NET から利用する場合、そのサイトを利用するクライアント側にも、
> Excel 本体が必要になりますが、その点は大丈夫ですか?
> (ライセンス上の理由です。技術的にはクライアント側には無くても動作します。)
>
>
>>どなたかご教授お願いします。
> Excel を ASP や ASP.NET から利用する事には、多数の問題がありますが、
> その事については理解されておられますでしょうか。
> http://support.microsoft.com/kb/257757/ja
>
>
>>Dim oBooks As Excel.Workbooks
>>Dim oSheet As Excel.Worksheet
>>Dim xlRange As Excel.Range
> 接頭辞 o と接頭辞 xl が、どのように使い分けされているのか気になります…。
>
>
>> If Path.GetExtension(FileUpload.FileName) = ".xls" Or _
>> Path.GetExtension(FileUpload.FileName) = ".Xls" Then
> 「.XLS」や「.xlS」や「.XLs」や「.XlS」などは無視ですか?
>
>
>> oSheet = oBook.Worksheets(1)
> Jitta さんが指摘されていますが、Worksheets についても、
>  Dim oSheets As Sheets = oBook.Worksheets
>  oSheet = DirectCast(oSheets(1), Excel.Worksheet)
> などのように、一度変数に受けて、最後に解放してください。
>
>
>>xlRange = oSheet.Cells
>>txtJyuchuSaki.Text = xlRange.Range("E19").Value
> これもNG。Range オブジェクトの参照を残していますので、
>  Dim oRange As Excel
>  oRange = xlRange.Range("E19")
>  txtJyuchuSaki.Text = oRange.Value
>  Marshal.ReleaseComObject(oRange)
> のようにして、途中の Range オブジェクトも処理してください。
>
>
>>System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange)
>>xlRange = oSheet.Cells
> xlRange には、既に oSheet.Cells が入っていますので、この 2 行は不要です。
>
>
>>txtJyuchuSaki.Text &= xlRange.Range("F19").Value
> これは NG。
> 先述したように、xlRange.Range("F19") が返す Range オブジェクトも解放対象です。
>
>
>>System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange)
>>xlRange = oSheet.Cells
> 先ほどと同様。
> xlRange には、既に oSheet.Cells が入っていますので、この 2 行は不要です。
>
>
>>txtJyuchuSaki.Text &= xlRange.Range("G19").Value
> 同じく、解放漏れ。
>
>
>>System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange)
>>xlRange = oSheet.Cells
> 同じく、不要。
>
> 以下同様なコードが続くので指摘省略。
>
>
>>txtTatemono.Text = ConvDec(xlRange.Range("E42").Value).ToString("#,##0")
> これらも、xlRange.Range("E42") が返す Range を変数に受けるとして…
>
>>System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange)
> ここが微妙。
>
> 確かに、ここより後では xlRange が使われないのですが、そもそも、
> この直後に Finally 句にて解放コードが記載されているため、不要では無いかと。
>
> ここで xlRange を解放すると、参照カウントが 0 になった xlRange が、
> Finally にてさらに解放されることになりかねません。
>
>
>> lblView()
> 内容が不明ですが、この中では Excel を操作してはいないのですね?
>
>
>>Else
>> Script = "<script language=javascript>" + "window.alert('EXCELファイルではありません。')" + "</script>"
>> Response.Write(Script)
>>End If
> ここまでは「& 演算子」で文字列連結しているのに、
> 何故ここでは「+ 演算子」で文字列連結しているのでしょうか?
>
> 別に「+」のままでも問題はありませんが、表記法がぶれるのは好ましくないので、ここは
>  Script = "<script language=javascript>" & "window.alert('EXCELファイルではありません。')" & "</script>"
> もしくは単に、
>  Script = "<script language=javascript>window.alert('EXCELファイルではありません。')</script>"
> などと記述する事をおすすめします。
>
>
>>Catch ex As Exception
> Exception を単に握りつぶす事は避けた方が良いかと。
>
> ユーザーにエラーを見せたくないにしても、せめてログには残しましょう。
> 何か問題が発生したとき、それを後から追跡できなくなりますよ。
> http://blogs.msdn.com/nakama/archive/2009/01/18/net-part-3.aspx

Jitta on the way様,魔界の仮面弁士様ありがとうございます。
お二人の指摘どおりソースを修正したらEXCEL.EXEが残らないように
なりました。
> Excel を ASP や ASP.NET から利用する事には、多数の問題がありますが、
> その事については理解されておられますでしょうか。
> http://support.microsoft.com/kb/257757/ja
前も一度読んでみたのですが、内容があまり理解できませんでした。

> ASP.NET から利用する場合、そのサイトを利用するクライアント側にも、
> Excel 本体が必要になりますが、その点は大丈夫ですか?
その点は大丈夫です。

現在、FileUpload.PostedFile.FileNameでアップロード対象のファイルのフルパスをとれると
思っていました。結果とれませんでした。

一度サーバー側で保存してからEXCELファイルにアクセスしないと駄目なのでしょうか?
その場合、アップロードされて保存されたファイルが一意の名称にならなかったら
上書きされてしまいます。クライアント毎に個別にIDを振り分けたいのですが
何かいい方法はありませんでしょうか?




引用返信 編集キー/
■44552 / inTopicNo.5)  Re[3]: ASP.NET EXCELが開放されない
□投稿者/ ひろと (1回)-(2009/12/11(Fri) 17:49:12)
SessioniDをファイル名に用いる事で一意になるようにしましたが、
この方法は駄目でしょうか。
一度保存して、処理が終わりしだいファイルを消しています。

引用返信 編集キー/
■44555 / inTopicNo.6)  Re[3]: ASP.NET EXCELが開放されない
□投稿者/ 魔界の仮面弁士 (1414回)-(2009/12/11(Fri) 18:41:32)
引用は適切に。

No44550 (ひろと さん) に返信
>> http://support.microsoft.com/kb/257757/ja
> 前も一度読んでみたのですが、内容があまり理解できませんでした。
まったく理解できない……では無かったのですよね?

理解する意思があるのに、調べてもどうしても分からないという点があるのなら、
その分からない箇所を具体的に質問すれば、回答が付くかも知れません。


> 現在、FileUpload.PostedFile.FileNameでアップロード対象のファイルのフルパスをとれると
> 思っていました。結果とれませんでした。
フルパスが送出されるかどうかは、ブラウザ側の実装に依存します。
http://bbs.wankuma.com/index.cgi?mode=al2&namber=31596&KLOG=56


> 一度サーバー側で保存してからEXCELファイルにアクセスしないと駄目なのでしょうか?
『ファイル化しないと駄目』だと思っておいた方が良いでしょう。

できるかできないかで言えば、ファイル化せずに処理する方法はありますが(下記参照)、
ファイルに保存した方が簡単だと思いますよ。

http://dobon.net/cgi-bin/vbbbs/cbbs.cgi?mode=al2&namber=24044&no=0&KLOG=3
http://www5.plala.or.jp/atata/net/chap29.html


> その場合、アップロードされて保存されたファイルが一意の名称にならなかったら
一意な名前で保存しましょう。
たとえば、System.IO.Path.GetTempFileName() を使うというのはどうですか?


> クライアント毎に個別にIDを振り分けたいのですが
その場合には、前回の ID を、データベースか何かに
保持しておくなどして、毎回、新しい番号を採番してみるとか。
引用返信 編集キー/
■44558 / inTopicNo.7)  Re[4]: ASP.NET EXCELが開放されない
□投稿者/ 魔界の仮面弁士 (1416回)-(2009/12/11(Fri) 20:18:20)
No44552 (ひろと さん) に返信
> SessioniDをファイル名に用いる事で一意になるようにしましたが、

同一セッションで、連続してファイルが再送されたりすると(ページのリロードなど?)、
同名のファイルになりそうですが、それでも構いませんか?

また、期限切れのセッションで使っていた SessionID が、後のセッションでも
同じ値で発行される可能性もあるかと思いますが、その点は大丈夫でしょうか。


> この方法は駄目でしょうか。

アプリの仕様次第かと思います。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -