- PR -

[解決]ASP.NETからのExcel作成でエラー

投稿者投稿内容
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-02-22 01:22
開放できないと困り物なのでやらなければいけないのはわかりますが
ロジックが埋もれてしまいそうですね・・・

まとめて開放だとこんな風になるんでしょうか
コード:

Private Shared Sub MosaMosaAA()
Dim xlApplication As Excel.Application
Dim xlBooks As Excel.Workbooks
Dim xlBook As Excel.Workbook
Dim xlSheet As Excel.Worksheet
Dim xlCells As Excel.Range
Dim xlRange As Excel.Range

Try
xlApplication = New Excel.Application
xlBooks = xlApplication.Workbooks
xlBook = xlBooks.Add()
xlSheet = DirectCast(xlBook.ActiveSheet, Excel.Worksheet)
xlCells = xlSheet.Cells
xlRange = DirectCast(xlCells(1, 1), Excel.Range)
xlRange.Value2 = "テスト"

xlBook.SaveAs("C:\MosaMosaAA.xls")

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

Finally
Try
If Not xlSheet Is Nothing Then
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet)
End If

Finally
If Not xlBook Is Nothing Then
Try
xlBook.Close()
Finally
Try
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook)
Finally
Try
If Not xlBooks Is Nothing Then
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBooks)
End If
Finally
If Not xlApplication Is Nothing Then
Try
xlApplication.Quit()
Finally
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApplication)
End Try
End If
End Try
End Try
End Try
End If

End Try
End Try
End Try
End Try
End Sub



# ちょっと修正

[ メッセージ編集済み 編集者: かるあ 編集日時 2006-02-22 01:25 ]
ジブ
大ベテラン
会議室デビュー日: 2005/09/22
投稿数: 135
投稿日時: 2006-02-22 01:33
引用:

じゃんぬねっとさんの書き込み (2006-02-21 15:26) より:

コード:

    Private Shared Sub MosaMosaAA()
        Dim xlApplication As Excel.Application

        Try
            xlApplication = New Excel.Application()
            Dim xlBooks As Excel.Workbooks

            Try
                xlBooks = xlApplication.Workbooks
                Dim xlBook As Excel.Workbook

                Try
                    xlBook = xlBooks.Add()
                    Dim xlSheet As Excel.Worksheet

                    Try
                        xlSheet = DirectCast(xlBook.ActiveSheet, Excel.Worksheet)
                        Dim xlCells As Excel.Range

                        Try
                            xlCells = xlSheet.Cells
                            Dim xlRange As Excel.Range

                            Try
                                xlRange = DirectCast(xlCells(1, 1), Excel.Range)
                                xlRange.Value2 = "テスト"
                            Finally
                                If Not xlRange Is Nothing Then
                                    System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange)
                                End If
                            End Try
                        Finally
                            If Not xlCells Is Nothing Then
                                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlCells)
                            End If
                        End Try
                    Finally
                        If Not xlSheet Is Nothing Then
                            System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet)
                        End If
                    End Try

                    xlBook.SaveAs("C:MosaMosaAA.xls")
                Finally
                    If Not xlBook Is Nothing Then
                        Try
                            xlBook.Close()
                        Finally
                            System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook)
                        End Try
                    End If
                End Try
            Finally
                If Not xlBooks Is Nothing Then
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBooks)
                End If
            End Try
        Finally
            If Not xlApplication Is Nothing Then
                Try
                    xlApplication.Quit()
                Finally
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApplication)
                End Try
            End If
        End Try
    End Sub






こう書いて等価のようにも思えます


コード:
        Dim xlApplication As Excel.Application 
        Dim xlBooks As Excel.Workbooks
        Dim xlBook As Excel.Workbook
        Dim xlSheet As Excel.Worksheet
        Dim xlCells As Excel.Range 
        Dim xlRange As Excel.Range 
        Try
            xlApplication = New Excel.Application()
            xlBooks = xlApplication.Workbooks
            xlBook = xlBooks.Add()
            xlSheet = DirectCast(xlBook.ActiveSheet, Excel.Worksheet)
            xlCells = xlSheet.Cells
            xlRange = DirectCast(xlCells(1, 1), Excel.Range)
            xlRange.Value2 = "テスト"
            xlBook.SaveAs("C:MosaMosaAA.xls")
            xlBook.Close()
            xlApplication.Quit()
        Finally
            If Not xlRange Is Nothing Then  System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange)
            If Not xlCells Is Nothing Then System.Runtime.InteropServices.Marshal.ReleaseComObject(xlCells)
            If Not xlSheet Is Nothing Then  System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet)
            If Not xlBook Is Nothing Then  System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook)
            If Not xlBooks Is Nothing Then   System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBooks)
            If Not xlApplication Is Nothing Then System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApplication)
        End Try



じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-22 02:01
引用:

ジブさんの書き込み (2006-02-22 01:33) より:

こう書いて等価のようにも思えます


いいえ、等価ではありません。

Dispose メソッドの場合は、例外が発生しないことが保証されていますが、
ReleaseComObject メソッドは保証されていません。

そのため、まとめてやりたいのであれば、かるあさんの方法になります。
解放専用のメソッドを作成し、例外を握り潰してやれば、
Finally にまとめて書くことが、"ほぼ" 等価にはなるでしょう。

ParamArray で解放させるメソッドを書く方法もあるでしょう。
この方法ですと、埋もれを回避することもできます。
(参照渡しのオーバーロードの方が、精神衛生上良いような気がしますが)

# C++/CLI でスマートポインタな実装がしたいものです。

1 番良いのは私の書いたベタな方法です。
参照カウントのインクリメントなどを考えると、スコープは大切です。

[ シグネチャを削除 ]

[ メッセージ編集済み 編集者: じゃんぬねっと 編集日時 2006-10-02 10:35 ]
ジブ
大ベテラン
会議室デビュー日: 2005/09/22
投稿数: 135
投稿日時: 2006-02-24 00:23
こんにちは。

引用:

じゃんぬねっとさんの書き込み (2006-02-22 02:01) より:

Dispose メソッドの場合は、例外が発生しないことが保証されていますが、
ReleaseComObject メソッドは保証されていません。

そのため、まとめてやりたいのであれば、かるあさんの方法になります。



ReleaseComObjectで例外が発生するとすればどのような例外でしょうか?
ちょっと想定していませんでした。

また、もしReleaseComObjectで例外が発生した場合は、結果的に起こる現象が違うものでしょうか?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-24 02:22
引用:

ジブさんの書き込み (2006-02-24 00:23) より:

ReleaseComObjectで例外が発生するとすればどのような例外でしょうか?
ちょっと想定していませんでした。


既存の Dispose メソッド以外は、特に例外が発生しないという保証はありません。

引用:

また、もしReleaseComObjectで例外が発生した場合は、結果的に起こる現象が違うものでしょうか?


Finally 句は続行可能でしょうか?

引用:

xlBook.Close()
xlApplication.Quit()


少なくともこの 2 つが保証されない位置にある以上、等価とは言えません。
等価と言える根拠は何かありますでしょうか?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ジブ
大ベテラン
会議室デビュー日: 2005/09/22
投稿数: 135
投稿日時: 2006-02-26 13:09
[quote]
じゃんぬねっとさんの書き込み (2006-02-24 02:22) より:
引用:

引用:

xlBook.Close()
xlApplication.Quit()


少なくともこの 2 つが保証されない位置にある以上、等価とは言えません。



確かに。そうですね。
ありがとうございました。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-02-26 19:10
引用:

じゃんぬねっとさんの書き込み (2006-02-22 02:01) より:

Dispose メソッドの場合は、例外が発生しないことが保証されていますが、
ReleaseComObject メソッドは保証されていません。


この可能性を考えていませんでした。。。

まぁ、Windows アプリケーションの場合、例外でアプリケーションが落ちれば解放もされますが、ASP.NET の場合は、ねぇ。。。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-26 21:31
引用:

Jittaさんの書き込み (2006-02-26 19:10) より:

この可能性を考えていませんでした。。。


実際には「まったくない」に近いくらいだと思います。
遅延バインディングを使っているならともかく、事前バインディングの場合は
型が保証されているので、ArgumentException も発生しないでしょうね。

ただ、Dispose メソッドとは違って "保証がない" というところで明示化すべきという意味です。
それと、有効範囲を狭めることで「暗黙の参照」を防ぐという意味でも良いことだと思っています。

引用:

まぁ、Windows アプリケーションの場合、例外でアプリケーションが落ちれば解放もされますが、ASP.NET の場合は、ねぇ。。。


COM の場合は勝手には解放されませんよー。
Windows ベースの場合は確かにプロセスから強制終了はできるというだけで、勝手には終了しません。
強制終了と COM 参照の解放は、またちょっと違いますからね。(^-^;)

ASP.NET の場合は致命的という意味では激しく同意します。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌

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