【问题标题】:Excel instances not closing after closing Excel file from DataGridView?从 DataGridView 关闭 Excel 文件后 Excel 实例未关闭?
【发布时间】:2016-05-14 06:58:53
【问题描述】:

我有一个可以打开 Excel 文件的DataGridView。关闭 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

【问题讨论】:

标签: vb.net


【解决方案1】:

改变

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

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

【讨论】:

  • 当excel工作簿被用户手动关闭时,我怎么知道何时调用release com对象?
猜你喜欢
  • 1970-01-01
  • 2015-09-07
  • 2019-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多