无法从VB.NET应用关闭Excel进程
我创建了下面的类来打开并收集excel文件中工作表的名称。在打开文件并返回每个工作表的名称时,它会按照应该的方式执行。不幸的是,我无法关闭该文件。这会使Excel.exe进程挂起。即使我尝试在这个类的底部关闭它,进程仍然挂起。我必须手动转到Windows任务管理器并终止进程,然后才能再次使用该文件。即使我退出应用程序,它仍然存在。有没有关于如何从代码中终止此进程的建议无法从VB.NET应用关闭Excel进程,.net,vb.net,winforms,excel,.net,Vb.net,Winforms,Excel,我创建了下面的类来打开并收集excel文件中工作表的名称。在打开文件并返回每个工作表的名称时,它会按照应该的方式执行。不幸的是,我无法关闭该文件。这会使Excel.exe进程挂起。即使我尝试在这个类的底部关闭它,进程仍然挂起。我必须手动转到Windows任务管理器并终止进程,然后才能再次使用该文件。即使我退出应用程序,它仍然存在。有没有关于如何从代码中终止此进程的建议 Imports Excel = Microsoft.Office.Interop.Excel Public Class Exc
Imports Excel = Microsoft.Office.Interop.Excel
Public Class ExcelWrapper
Dim strTypeSelection As String = String.Empty
Dim strFilePath As String = String.Empty
Function GetWorksheetsByName(ByVal strfilePath As String) As Array
Dim xlsApp As Excel.Application
Dim xlsWorkBook As Excel.Workbook
xlsApp = New Excel.Application
xlsWorkBook = xlsApp.Workbooks.Open(strfilePath)
Dim intWsCount As Integer = xlsApp.Worksheets.Count
Dim sarWorksheetName(intWsCount - 1) As String
Dim i As Integer = 0
'gathers the names off all the worksheets
For Each totalWorkSheets In xlsApp.Worksheets
sarWorksheetName(i) = totalWorkSheets.Name
i += 1
Next totalWorkSheets
xlsWorkBook.Close(strfilePath)
xlsApp.DisplayAlerts = False
xlsApp.Quit()
Return sarWorksheetName
End Function
End Class
我以前也遇到过这个问题,我记得解决方案是对来自Office库的所有对象调用
封送.ReleaseComObject(Object obj)
或封送.FinalReleaseComObject(Object obj)
。不过,我很可能是错的。祝你好运,办公自动化是一个巨大的痛苦。以下是我在通过自动化处理Excel时使用的清理代码。你必须正确地清理,否则这个过程会像你看到的那样挂起。我假设您是通过桌面应用程序而不是web应用程序来执行此操作的。这通常是在finally块中完成的,示例是c#,但我认为您应该能够根据自己的需要调整它
GC.Collect();
GC.WaitForPendingFinalizers();
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(range);
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(sheet);
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(book);
WB.Close(false, Type.Missing, Type.Missing);
Excel.Quit();
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(Excel);
对于每个参考,尝试添加
System.Runtime.InteropServices.Marshal.ReleaseComObject(xxx)
xxx = nothing
()来自
这不是针对您的Excel问题的;但是您可以使用以下命令按名称终止进程
Dim pProcess() As Process = System.Diagnostics.Process.GetProcessesByName("WhateverYouWant")
For Each p As Process In pProcess
p.Kill()
Next
这将杀死与特定名称匹配的所有进程
您可能想尝试添加
Excel=无
若要查看这是否解决了问题(您可以避免强制终止进程)。我将这样修改代码的结尾部分,以更正可能导致问题的一些问题:
For Each totalWorkSheets as Excel.Worksheet In xlsWorkBook.Worksheets 'not xlsApp.Worksheets
sarWorksheetName(i) = totalWorkSheets.Name
i += 1
Next totalWorkSheets
xlsWorkBook.Close Savechanges:=False
set xlsWorkBook = Nothing
xlsApp.Quit()
set xlsApp = Nothing
这是正确的。请看我在a上的答案,但在C中。这是有效的!我必须在流程消失之前发布Excel.Application、Excel.Workbook和Excel.Worksheet。答案很好!这帮助了我。
For Each totalWorkSheets as Excel.Worksheet In xlsWorkBook.Worksheets 'not xlsApp.Worksheets
sarWorksheetName(i) = totalWorkSheets.Name
i += 1
Next totalWorkSheets
xlsWorkBook.Close Savechanges:=False
set xlsWorkBook = Nothing
xlsApp.Quit()
set xlsApp = Nothing