无法从VB.NET应用关闭Excel进程

无法从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

我创建了下面的类来打开并收集excel文件中工作表的名称。在打开文件并返回每个工作表的名称时,它会按照应该的方式执行。不幸的是,我无法关闭该文件。这会使Excel.exe进程挂起。即使我尝试在这个类的底部关闭它,进程仍然挂起。我必须手动转到Windows任务管理器并终止进程,然后才能再次使用该文件。即使我退出应用程序,它仍然存在。有没有关于如何从代码中终止此进程的建议

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