2

専門家の方、これを行う最善の方法を教えてください...

私は、Microsoft.Office.Interop.Excel オブジェクト ライブラリを使用してワークブック内にワークシートを作成し、それらのワークシート内にピボット テーブルを作成する VB.Net アプリケーションに取り組んでいます。

私のコードは次のようになります。

Dim ExcelApp As New Microsoft.Office.Interop.Excel.Application
Dim wbk As Microsoft.Office.Interop.Excel.Workbook = Nothing
Dim wksRawData As Microsoft.Office.Interop.Excel.Worksheet = Nothing
Dim wksPvtTbl As Microsoft.Office.Interop.Excel.Worksheet = Nothing
Dim pvtCache As Microsoft.Office.Interop.Excel.PivotCache = Nothing
Dim pvtTables As Microsoft.Office.Interop.Excel.PivotTables = Nothing
Dim pvtTable As Microsoft.Office.Interop.Excel.PivotTable = Nothing
Dim r1 As Microsoft.Office.Interop.Excel.PivotField = Nothing
Dim r2 As Microsoft.Office.Interop.Excel.PivotField = Nothing
Dim df1 As Microsoft.Office.Interop.Excel.PivotField = Nothing

Try

... Create the objects, put in the information

Catch ex As Exception
   MessageBox.Show("There was an error creating the Excel file", "Error Creating File", MessageBoxButtons.OK)
Finally

   ReleaseObject(r1)
   ReleaseObject(r2)
   ReleaseObject(df1)
   ReleaseObject(pvtTable)
   ReleaseObject(pvtTables)
   ReleaseObject(pvtCache)
   ReleaseObject(wksRawData)
   ReleaseObject(wksPvtTbl)
   ReleaseObject(wbk)

   ExcelApp.DisplayAlerts = True
   ExcelApp.Quit()
   ReleaseObject(ExcelApp)

   ExcelApp = Nothing
   wbk = Nothing
   wksRawData = Nothing
   GC.Collect()
End Try

次に、リリース オブジェクトのコードは次のようになります。

Public Sub ReleaseObject(ByRef Reference As Microsoft.Office.Interop.Excel.Application)
    Dim i As Integer
    If Reference IsNot Nothing Then
        i = System.Runtime.InteropServices.Marshal.ReleaseComObject(Reference)

        While i > 0
            i = System.Runtime.InteropServices.Marshal.ReleaseComObject(Reference)
        End While

        Reference = Nothing
    End If
End Sub

Public Sub ReleaseObject(ByRef Reference As Microsoft.Office.Interop.Excel.Workbook)
    Dim i As Integer
    If Reference IsNot Nothing Then
        i = System.Runtime.InteropServices.Marshal.ReleaseComObject(Reference)

        While i > 0
            i = System.Runtime.InteropServices.Marshal.ReleaseComObject(Reference)
        End While

        Reference = Nothing
    End If
End Sub

... etc

この種の問題には多くの解決策があることは知っていますが、自分の現在の状況に最も適した方法を知るために、さまざまな方法で迷っています...これはこれを行う良い方法ですか?そうでない場合は、より効率的な方法??

ありがとう!!!

4

5 に答える 5

3

リリースを手動で検索して呼び出さないでください。アプリケーションが壊滅的にクラッシュした場合、Interop プロセスは依然として緩んでいる可能性があります。

Job Objectsを介して Interop プロセスを OS に登録します。

ここに解決策があります: https://stackoverflow.com/a/1307180/160146

于 2012-10-16T17:07:42.800 に答える
0

私は過去にExcelが適切に閉じられないという問題を抱えていました。

これが私がすることです:

  • すべてのワークブック、次にすべてのアプリケーションを.Close()および.Dispose()するようにしてください
  • また、Marshal.ReleaseComObject()ですが、1回だけです。私はあなたのようにforループを実行したことはありません。
  • 次に、GC.Collect()とGC.WaitForPendingFinalizers()
  • 通常、最初にDisplayAlertsとInteractiveをfalseに設定します。バックグラウンドでポップアップが実行されていないことを確認してください。

相互運用機能を使用してピボットテーブルを作成したことはありません。

于 2012-10-16T14:49:10.197 に答える
0

私の答えは最善ではありませんが、うまくいきます:(アプリで使用されているExcelプロセスを強制終了します)

Excel 相互運用オブジェクトを適切にクリーンアップするにはどうすればよいですか?

于 2012-10-16T13:55:17.193 に答える