Excel进程仍然在VB.net关闭后运行(Excel process still runs aft

2019-06-26 16:53发布

我的问题基本上是如何结束这种使用Excel时运行Excel.exe进程。 在我打开和使用Excel工作簿与一对夫妇纸上的应用程序,然后让他们为用户为所欲为,我的问题是,我的应用程序不会放手Excel进程的。

如果应用程序正在关闭的Excel之前关闭,当关闭Excel过程结束,否则的话我关闭我的应用程序关闭后的excel,过程保持运行。

我已经尝试了一些事情我已经在互联网发现做GC.Collect的,等待却既不工作沿着这些线路挂起终结器什么的。

我也可以关闭Excel进程令人高兴的是,唯一的问题是不知道我是否关闭的用户,他们已经忽略了保存又或我的重要电子表格。

我不知道如果我的任何代码将与答案帮助,但我使用的Microsoft.Office.Interop.Excel去Excel和我使用已经保存在应用程序的资源文件夹中的工作簿。

-编辑-

这里的一切,我已经试过了,我知道这是一个有点矫枉过正,但遗憾的是它仍然无法结束进程

Marshal.ReleaseComObject(FirstWorksheet)
Marshal.FinalReleaseComObject(FirstWorksheet)
Marshal.ReleaseComObject(SecondWorksheet)
Marshal.FinalReleaseComObject(SecondWorksheet)
Marshal.ReleaseComObject(ThirdWorksheet)
Marshal.FinalReleaseComObject(ThirdWorksheet)
Marshal.ReleaseComObject(FourthWorkSheet)
Marshal.FinalReleaseComObject(FourthWorkSheet)
Marshal.ReleaseComObject(xlRange)
Marshal.FinalReleaseComObject(xlRange)
Marshal.ReleaseComObject(SecondxlRange)
Marshal.FinalReleaseComObject(SecondxlRange)
Marshal.ReleaseComObject(thirdxlRange)
Marshal.FinalReleaseComObject(thirdxlRange)
Marshal.ReleaseComObject(fourthxlRange)
Marshal.FinalReleaseComObject(fourthxlRange)
Marshal.ReleaseComObject(.activeworkbook)
Marshal.FinalReleaseComObject(.activeworkbook)
Marshal.ReleaseComObject(excelApplication)
Marshal.FinalReleaseComObject(excelApplication)
MSExcelControl.QuitExcel() 'A function made by someone else I work with that was meant to close excel's process
GC.Collect()
GC.WaitForPendingFinalizers()
GC.Collect()
GC.WaitForPendingFinalizers()

CNC中这里的quitExcel方法

Friend Shared Sub QuitExcel()
    If Not getExcelProcessID = -1 Then
        If Not excelApp Is Nothing Then
            'Close and quit
            With excelApp
                Try
                    Do Until .Workbooks.Count = 0
                        'Close all open documents without saving
                        .Workbooks(1).Close(SaveChanges:=0)
                    Loop
                Catch exExcel As Exception
                    'Do nothing
                End Try
                Try
                    .ActiveWorkbook.Close(SaveChanges:=0)
                Catch ex As Exception
                    'Do nothing
                End Try

                Try
                    .Quit()
                Catch ex As Exception
                    'Do nothing
                Finally
                    myExcelProcessID = -1
                End Try
            End With
            excelApp = Nothing
        End If
    End If
End Sub

他已经尝试做同样的事情的进程ID在他的课上,问题是他不工作这就是为什么我试图再次获得进程ID我已经工作

Answer 1:

很好的解决亚历克斯,我们不应该这样做,但是我们做什么,只是EXCEL不会结束。 我把你的解决方案,并创建下面的代码,我在我的应用程序导入或导出与Excel之前调用ExcelProcessInit,然后调用ExcelProcessKill它完成之后。

Private mExcelProcesses() As Process

Private Sub ExcelProcessInit()
  Try
    'Get all currently running process Ids for Excel applications
    mExcelProcesses = Process.GetProcessesByName("Excel")
  Catch ex As Exception
  End Try
End Sub

Private Sub ExcelProcessKill()
  Dim oProcesses() As Process
  Dim bFound As Boolean

  Try
    'Get all currently running process Ids for Excel applications
    oProcesses = Process.GetProcessesByName("Excel")

    If oProcesses.Length > 0 Then
      For i As Integer = 0 To oProcesses.Length - 1
        bFound = False

        For j As Integer = 0 To mExcelProcesses.Length - 1
          If oProcesses(i).Id = mExcelProcesses(j).Id Then
            bFound = True
            Exit For
          End If
        Next

        If Not bFound Then
          oProcesses(i).Kill()
        End If
      Next
    End If
  Catch ex As Exception
  End Try
End Sub

Private Sub MyFunction()
  ExcelProcessInit()
  ExportExcelData() 'Whatever code you write for this...
  ExcelProcesKill()
End Sub


Answer 2:

它采取了很长的时间,但我终于解决了它,做它是当你创建Excel应用程序来记录进程ID的最佳方式,这意味着,你知道的,只有你的进程相关联的唯一ID。

要做到这一点,我看着那些已经存在的所有进程,在ID数组记录的Excel进程的标识

            msExcelProcesses = Process.GetProcessesByName("Excel")
            'Get all currently running process Ids for Excel applications
            If msExcelProcesses.Length > 0 Then
                For i As Integer = 0 To msExcelProcesses.Length - 1
                    ReDim Preserve processIds(i)
                    processIds(i) = msExcelProcesses(i).Id
                Next
            End If

然后重复这一过程打开矿难发生后直(尝试,并防止他们打开Excel本身具有2个新的Excel程序)录制新的ID,检查一个ID,这不是在最后一个列表并将其存储为一个整数。

然后,所有你需要做底通过的进程列表循环,杀死一个与你的ID

                Dim obj1(1) As Process
                obj1 = Process.GetProcessesByName("EXCEL")
                For Each p As Process In obj1
                    If p.Id = MSExcelControl.getExcelProcessID Then
                        p.Kill()
                    End If
                Next


Answer 3:

我知道这是一个古老的线程,但如果有人回来到这一点,你实际上有打电话给每一个Interop.Excel对象,你工作簿中的触摸。 如果你拉从Excel中实例化的类到你的代码,当你用它做,对Marshal.ReleaseComObject。 甚至每一个细胞。 这很疯狂,但它是我能得到解决同一问题的唯一途径。

并织补确保你没有一个致命异常,并留下一些未发行... Excel将继续开放。

Excel.Applicaiton? Marshal.ReleaseComObject的。

Excel.Workbook? Marshal.ReleaseComObject的。

Excel.Workshet? Marshal.ReleaseComObject的。

Excell.Range? Marshal.ReleaseComObject的。

通过行循环? Marshal.ReleaseComObject的每一行和单元格您遍历。

Exce.Style? Marshal.ReleaseComObject的......至少这是我必须做的......

如果你打算使用PIA来访问Excel,从你写第一行代码,计划你将如何释放你的对象。 我有过的最好的办法是确保我拉一个Excel值了Excel对象,并将其加载到我自己的内部变量。 然后imediately叫你访问Marshal.ReleaseComObject的。 通过Excel对象通过列表中一个应用程序循环,工作簿,薄板,的ListObject,表等,往往是最难释放。 因此,规划是一叶知秋。



Answer 4:

我前一阵子有同样的问题,尝试在你的Excel对象使用Marshal.ReleaseComObject的。 它位于埃德System.Runtime.InteropServices命名空间。 还记得事先关闭您的Excel对象。

xlWorkbook.Close();
xlApp.Close();
Marshal.ReleaseComObject(xlWorkbook);
Marshal.ReleaseComObject(xlApp);


文章来源: Excel process still runs after closing in VB.net