Excel 关闭 vb.net 应用后仍然 运行
Excel still running after close vb.net app
我在关闭 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 个文件? :)
试试 workbook.Save
、workbook.close
我的 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# 编写任何代码了,感觉很不习惯。我只看到你的问题是因为我点击了错误的 link 并想起了我在开始编程时曾经如何与垃圾收集作斗争。
释放 Excel.Application
Interop COM 对象比其他 Office Interop 对象稍微复杂一些,因为有些对象是在您不知情的情况下创建的,并且必须在实际关闭主应用程序之前释放它们。
这些对象包括:
- The Excel.Application
- The Excel.Application.WorkBooks collection
- The WorkBooks collection opened WorkBook
- The WorkBook Sheets collection
- The Sheets collection referenced Worksheet
必须全部释放这些对象才能终止 EXCEL 进程。
一个简单的解决方案是对所有 COM 对象使用显式 declarations/assignment:
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()
我在关闭 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 个文件? :)
试试 workbook.Save
、workbook.close
我的 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# 编写任何代码了,感觉很不习惯。我只看到你的问题是因为我点击了错误的 link 并想起了我在开始编程时曾经如何与垃圾收集作斗争。
释放 Excel.Application
Interop COM 对象比其他 Office Interop 对象稍微复杂一些,因为有些对象是在您不知情的情况下创建的,并且必须在实际关闭主应用程序之前释放它们。
这些对象包括:
- The Excel.Application
- The Excel.Application.WorkBooks collection
- The WorkBooks collection opened WorkBook
- The WorkBook Sheets collection
- The Sheets collection referenced Worksheet
必须全部释放这些对象才能终止 EXCEL 进程。
一个简单的解决方案是对所有 COM 对象使用显式 declarations/assignment:
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()