我有一个程序可以创建excel对象,写入Excel工作表,打印,保存,最后退出。然而,当然,我可以在任务管理器中看到一个excel僵尸,只有在程序完全关闭后才会消失,(但是直到写入excel开始才会消失。)这让我疯了,我读了几十个有关如何使用垃圾收集来解决此问题的示例,但似乎没有工作。我也不想使用杀戮过程,因为这显然不是正确的方法。我也发誓我曾经让它工作过一次,也许当程序没有时,“另存为”一个新的excel表。我相信错误可能是,我只关闭了一个excel表,而新版本的版本保持打开状态。 (使用win 10和Excel 2016)
Dim objExcel As New Microsoft.Office.Interop.Excel.Application()
Dim objWorkbook As Excel.Workbook 'Represents a workbook object
Dim objWorksheet As Excel.Worksheet 'Represents a worksheet object
Dim OrderTemplate As String = "insert file path here"
objWorkbook = objExcel.Workbooks.Open(OrderTemplate)
objExcel.DisplayAlerts = False
objExcel.ActiveWorkbook.Close(SaveChanges:=True)
objExcel.DisplayAlerts = True
objExcel.Quit()
objExcel = Nothing
GC.GetTotalMemory(False)
GC.Collect()
GC.WaitForPendingFinalizers()
GC.Collect()
GC.WaitForPendingFinalizers()
GC.GetTotalMemory(False)
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(objWorksheet)
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(objWorkbook)
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(objExcel)
Private Sub releaseObject(ByVal obj As Object)
Try
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(obj)
obj = Nothing
Catch ex As Exception
obj = Nothing
Finally
GC.Collect()
End Try
End Sub
答案 0 :(得分:0)
您还需要定义WorkBooks
集合,否则它将成为孤儿,您将无法杀死父应用程序:
Imports Excel = Microsoft.Office.Interop.Excel
Dim objExcel As New Excel.Application
Dim objWorkbooks As Excel.Workbooks = objExcel.Workbooks
Dim objWorkbook As Excel.Workbook = objWorkbooks.Open(OrderTemplate)
Dim objWorksheet As Excel.Worksheet = DirectCast(objWorkbook.Sheets(1), Excel.Worksheet)
然后按顺序杀掉对象:
objWorksheet = Nothing
objWorkbook.Close(False)
objWorkbook = Nothing
objWorkbooks = Nothing
objExcel.Quit()
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(objExcel)
objExcel = Nothing
GC.Collect()
我读过的另一篇文章也说过每个对象(按此顺序):
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(objWorksheet)
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(objWorkbook)
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(objWorkbooks)
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(objExcel)
答案 1 :(得分:0)
我刚刚解决了这个问题...... 没有理由要求发布()
只需将您的Excel代码放在私有子中。 示例>
Private sub Excelexc()
'excel code
end sub
然后打电话给它。
Private Sub ButtonPreview_Click(sender As Object, e As EventArgs) Handles ButtonPreview.Click
ExcelExc()
GC.Collect()
GC.WaitForPendingFinalizers()
GC.Collect()
GC.WaitForPendingFinalizers()
End Sub
还要确保以相反的方式关闭excel对象。
objExcel1.Visible = True
objWorkbook1.Sheets.PrintPreview()
objWorkbook1.Close(SaveChanges:=False)
objExcel1.Quit()
这是我的。嗯,有很多方法可以修复它,但在某些情况下,甚至很难摆脱双点和类似的东西。
好吧,祝你好运。