从DataGridView关闭Excel文件后Excel实例没有关闭?

时间:2016-05-13 15:17:14

标签: vb.net

我有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

1 个答案:

答案 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。如果您使用其他方式来读取文件,则可以避免所有这些。

很多人会告诉你如何解决问题(包括我),这很好。但是作为回报所有解决问题的工作的回报,你会得到一个不太理想的解决方案,可能会遇到更多问题。这就是我强烈推荐替代品的原因。

相关问题