2011-02-25 29 views
5

Tengo problemas al usar la interoperabilidad con Office excel en .net. He intentado muchas cosas para cerrar la aplicación de Excel, el libro de trabajo y las hojas de trabajo que creo para usar en mi programa, pero siempre noto que excel.exe aún está en la memoria. Incluso intenté forzar al recolector de basura, por favor ayuda.Problema al cerrar la aplicación excel interoperabilidad correctamente en .net

Aquí está el código que utilizo para crear instancias de todo:

Private mExcelApp As Microsoft.Office.Interop.Excel.ApplicationClass 
Private mWorkBook As Microsoft.Office.Interop.Excel.Workbook 
Private mWorkSheet As Microsoft.Office.Interop.Excel.Worksheet 


    Public Sub Execute() 

    mExcelApp = New Microsoft.Office.Interop.Excel.ApplicationClass 
    If mFirstPass Then 
     mWorkBook = mExcelApp.Workbooks.Add() 
     mWorkSheet = CType(mWorkBook.ActiveSheet(), Microsoft.Office.Interop.Excel.Worksheet) 
    Else 
     mWorkBook = mExcelApp.Workbooks.Open(System.IO.Path.Combine(mFileLocation, mMTDefinition.Description & "_" & mMTDefinition.Version & ".xls")) 
     mWorkSheet = CType(mWorkBook.Sheets(1), Microsoft.Office.Interop.Excel.Worksheet) 
     Dim excelRange As Microsoft.Office.Interop.Excel.Range = mWorkSheet.UsedRange 
     excelRange.SpecialCells(Microsoft.Office.Interop.Excel.XlCellType.xlCellTypeLastCell).Activate() 
     mCurrentRow = mExcelApp.ActiveCell.Row + 1 

    End If 

    Here is how i try to close everything 

    If mFirstPass Then 
     mWorkBook.SaveAs(System.IO.Path.Combine(mFileLocation, mMTDefinition.Description & "_" & mMTDefinition.Version & ".xls")) 
     mFirstPass = False 
     Else 
     mWorkBook.Save() 
    End If 
     a 
    mWorkBook.Close() 
    mExcelApp.Quit() 

    mWorkSheet = Nothing 
    mWorkBook = Nothing 
    mExcelApp = Nothing 
    System.GC.Collect() 
+0

has intentado 'para cada libro en mExcelApp.Workbooks: book.saved = true: next'? –

Respuesta

5

La idea básica es llamar a Marshal.ReleaseComObject para cada objeto COM creado.

Dim app As New Excel.Application() 
    Dim workBook As Excel.Workbook = app.Workbooks.Add() 
    Try 

     Dim t As Int32 = 0 
     ' This example is filling an excel spreadsheet using data stored in a Dictionary 
     For Each key In sampleData.Keys 
      t += 1 
      ' Add a worksheet and dump data. 
      Dim sheet As Excel.Worksheet = workBook.Worksheets.Add() 
      sheet.Name = key 

      ' Set columns 
      For i = 1 To sampleData(key).Columns.Count 
       sheet.Cells(1, i) = sampleData(key).Columns(i - 1).ColumnName 
      Next 

      ' Set data. 
      For r = 1 To sampleData(key).Rows.Count 
       For c = 1 To sampleData(key).Columns.Count 
        sheet.Cells(r + 1, c) = sampleData(key).Rows(r - 1).Item(c - 1).ToString() 
       Next c 
      Next r 
      Marshal.ReleaseComObject(sheet) 
     Next 

     workBook.SaveAs("fileName.xls", Excel.XlFileFormat.xlExcel8) 
     workBook.Close(SaveChanges:=False) 

    Finally 
     app.Quit() 
     Marshal.ReleaseComObject(workbook) 
     Marshal.ReleaseComObject(app) 
     app = Nothing 
    End Try 
+0

Muchas gracias Justin, esto funcionó totalmente para mí. Ahora sé cómo manejar objetos com no administrados. –

+0

¡Feliz de ayudar, buena suerte! –

2

Como la aplicación Excel es un objeto COM no administrado, la recuperación de la memoria administrada podría no funcionar. He usado

Marshal.ReleaseComObject(mExcelApp); 

con cierto éxito.

+0

Voy a intentarlo. Muchas gracias –

Cuestiones relacionadas