关闭www.example.com应用程序后Excel仍在运行vb.net

5ktev3wc  于 2023-06-30  发布在  .NET
关注(0)|答案(4)|浏览(115)

关闭Excel文件时遇到一些问题。我正在做一个程序,打开一些Excel文件,使用信息,然后关闭它们。
我尝试了一些不同的代码,但它们不起作用,因为EXCEL进程仍在运行。
我的第一个代码:

Dim aplicacaoexcel As New Excel.Application
Dim livroexcel As Object
Dim folhaexcel As Excel.Worksheet

livroexcel = aplicacaoexcel.Workbooks.Open("C:\Users\LPO1BRG\Desktop\Software Fiabilidade\Tecnicos.xlsx", UpdateLinks:=False, ReadOnly:=False, Password:="qmm7", WriteResPassword:="qmm7")
folhaexcel = livroexcel.sheets("Folha1")

aplicacaoexcel.DisplayAlerts = False
aplicacaoexcel.Visible = False
folhaexcel = Nothing
livroexcel.Close()
livroexcel = Nothing
aplicacaoexcel.Quit()
aplicacaoexcel = Nothing

然后我补充说:System.GC.Collect()但它仍然没有关闭Excel进程。
现在我正在尝试这个:

Dim process() As Process = system.Diagnostics.Process.GetProcessesByName("EXCEL")

For Each p As Process In process
   p.Kill()
Next

实际上,这一个正在工作,但它关闭了所有的Excel文件(即使是那些没有被我的程序打开的文件)。
我该怎么做才能只关闭我的程序打开的Excel文件?:)

bybem2ql

bybem2ql1#

释放Excel.Application Interop COM对象比释放其他Office Interop对象稍微复杂一些,因为有些对象是在您不知情的情况下创建的,并且必须在实际关闭主应用程序之前释放所有对象。
这些对象包括:

  • Excel应用程序
  • Excel.Application.WorkBooks集合
  • WorkBooks集合打开WorkBook
  • 工作簿工作表集合
  • Sheets集合引用的Worksheet

这些对象必须全部释放才能终止EXCEL进程。
一个简单的解决方案是对所有COM对象使用显式声明/赋值:

Dim ExcelApplication As New Microsoft.Office.Interop.Excel.Application()
Dim ExcelWorkbooks As Workbooks = ExcelApplication.Workbooks
Dim MyWorkbook As Workbook = ExcelWorkbooks.Open("[WorkBookPath]", False)
Dim worksheets As Sheets = MyWorkbook.Worksheets
Dim MyWorksheet As Worksheet = CType(worksheets("Sheet1"), Worksheet)

当你完成后,释放它们:

Imports System.Runtime.InteropServices

Marshal.ReleaseComObject(MyWorksheet)
Marshal.ReleaseComObject(worksheets)

MyWorkbook.Close(False)   '<= False if you don't want to save it!
Marshal.ReleaseComObject(MyWorkbook)

ExcelWorkbooks.Close()
Marshal.ReleaseComObject(ExcelWorkbooks)

ExcelApplication.Quit()
Marshal.FinalReleaseComObject(ExcelApplication)

Marshal.CleanupUnusedObjectsInCurrentContext()
oaxa6hgo

oaxa6hgo2#

尝试类似workbook.Saveworkbook.close的代码

cyvaqqii

cyvaqqii3#

我对我的VB有点生疏,现在没有访问Visual Studio来测试这个,但我会尝试从内存中编写代码。
您遇到的问题是,将对象设置为Nothing仍然会将对象分配在内存中,并且不会完全释放对象。即使是对象的Close()和Quit()方法也会将其分配在内存中,以防程序以后需要再次访问它们。Kill()方法之所以有效,是因为它只是终止在内存中运行的Excel应用程序,这将关闭任何打开的Excel文档以及COM对象使用的文档。您要做的是释放应用程序正在使用的特定COM对象。
在你的代码中尝试这个改变。

Dim aplicacaoexcel As New Excel.Application
Dim livroexcel As Object
Dim folhaexcel As Excel.Worksheet

livroexcel = aplicacaoexcel.Workbooks.Open("C:\Users\LPO1BRG\Desktop\Software Fiabilidade\Tecnicos.xlsx", UpdateLinks:=False, ReadOnly:=False, Password:="qmm7", WriteResPassword:="qmm7")
folhaexcel = livroexcel.sheets("Folha1")

aplicacaoexcel.DisplayAlerts = False
aplicacaoexcel.Visible = False

DisposeComObj(folhaexcel)
DisposeComObj(livroexcel)
DisposeComObj(aplicacaoexcel)

然后将以下内容也添加到您的应用程序中。

Private Sub DisposeComObj(ByRef Reference As Object)
    Try        
        Do Until _
        System.Runtime.InteropServices.Marshal.ReleaseComObject(Reference)<=0
        Loop
    Catch
    Finally
        Reference = Nothing
    End Try
End Sub

我希望我的记忆是服务我好。我已经一年多没有用VB或C#写过任何代码了,感觉很生疏。我只看到你的问题,因为我点击了错误的链接,并记得我如何使用垃圾收集斗争时,我开始编程。

bis0qfac

bis0qfac4#

  • 在过程开始时输入以下内容:*

dim ExcellProcesses as string ="”
Dim startprocesses()As Process = system.Diagnostics.Process.GetProcessesByName(“EXCEL”)
对于启动进程中的每个sP As进程
ExcellProcesses = ExcellProcesses &“;“& sP.id()&“;”
下一个

  • 在过程结束时放入:*

Dim process()As EndProcesses = system.Diagnostics.Process.GetProcessesByName(“EXCEL”)
对于每个eP作为Endprocesses中的进程if instr(ExcellProcesses,“;“& eP.id()&“;”)=0 then eP.kill Next
这样,只有新打开的Excell进程将被终止。

相关问题