我有DataGridView
可以打开Excel文件。关闭Excel文件后,实例仍在Windows任务管理器进程中打开。如果我从DataGridView
打开另一个Excel文件,则会再次打开另一个实例,依此类推。关闭Excel文件时有没有办法关闭实例?如果我关闭DataGridView
所在的表单,则会关闭所有Excel实例。
这是我的代码:
Public Sub openExcel()
'my code.... blah blah blah....
'open excel
Dim xlsApp As Excel.Application
Dim xlsWB As Excel.Workbook
xlsApp = New Excel.Application
xlsApp.Visible = True
xlsWB = xlsApp.Workbooks.Open(c:\myExcelFile.xlsm")
End Sub
答案 0 :(得分:0)
更改
xlsWB = xlsApp.Workbooks.Open(c:\myExcelFile.xlsm")
到
Dim workbooks as Excel.Workbooks = xlsApp.Workbooks
xlsWB = workbooks.Open(c:\myExcelFile.xlsm")
然后,对于创建的每个变量,请务必调用
System.Runtime.InteropServices.Marshal.ReleaseComObject(workbooks)
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlsWB)
等等,很多很多等等。
这些都是COM对象,在它们被释放之前,它们在内存中保持活跃。
xlsApp.Workbooks.Open
创建了对没有变量的Workbooks
对象的引用,因此无法明确释放它。
在Excel对象模型中创建的每个对象都需要自己的变量,并且必须显式释放每个对象,即使抛出异常也是如此。
这可能会导致您得出结论(as it did for me)它不值得麻烦,并且您最好使用像EPPlus这样的库。或者尝试reading from it like it's a database。
我建议查看备选方案的一个原因是,这可能不是您将遇到的唯一问题。在阅读Excel电子表格的所有方法中,启动Excel实例并自动化它是最成问题的。我听说过应用程序提示输入的情况,除了它a)不可见和b)在Web服务器上,无论如何都没有人能看到提示,所以它只是挂起并失败。它还意味着支付许可证以在Web服务器上安装Excel。如果您使用其他方式来读取文件,则可以避免所有这些。
很多人会告诉你如何解决问题(包括我),这很好。但是作为回报所有解决问题的工作的回报,你会得到一个不太理想的解决方案,可能会遇到更多问题。这就是我强烈推荐替代品的原因。