为啥excel一直打开? [复制]

Posted

技术标签:

【中文标题】为啥excel一直打开? [复制]【英文标题】:Why does excel remain open? [duplicate]为什么excel一直打开? [复制] 【发布时间】:2009-12-10 21:37:03 【问题描述】:

可能重复:How to properly clean up Excel interop objects in C#

我有这个函数用来计算一些数据的线性趋势:

private string Trend(object conocido_y, object conocido_x, object nueva_matriz_x)

    string result = String.Empty;
    try 
        Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
        result = ((Array)xlApp.WorksheetFunction.Trend(conocido_y, conocido_x, nueva_matriz_x, true)).GetValue(1).ToString();
        xlApp.Quit();
        System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp);
        xlApp = null;
    
    catch (System.Runtime.InteropServices.COMException ex) 
        DError.ReportarError(ex, false);
    
    catch (Exception ex) 
        DError.ReportarError(ex);
    
    return result;

结果很好但是excel应用程序没有关闭,如果我打开任务管理器进程仍在运行,为什么?

【问题讨论】:

但是“正确答案”不是被接受的,因为它对提问者不起作用。它甚至没有一票(我现在要投赞成票)。 【参考方案1】:

我记得看到过,在 ReleaseComObject() 之后,强制 GC 传递是由于对象被释放并最终死掉。

另外,我在那个 sn-p 中看不到它,但是您必须在任何工作表或其他您可能已经掌握的 Excel 对象中使用 ReleaseComObject()(结果是这样的吗?)。

ReleaseComObject(result);
app.Aplication.Quit();
ReleaseComObject(app);
GC.Collect();

【讨论】:

@Vinko 谢谢 Vinko 就是这样!【参考方案2】:

您的函数是否会产生错误?如果是这样,永远不会到达 Quit()。您可能希望将 Quit 和 ReleaseComObject 放在 finally 块中。

【讨论】:

这确实是个好主意,即使它可能无法解决问题。 是的,我刚刚重新阅读了您的问题,您说结果还可以,所以可能不是问题。我有同样的问题,Excel 仍然出现在任务管理器中。一段时间后它们消失了,所以这可能是 GC 的问题。 @Chris。这怎么可能让我失去理智?!马上做出改变!谢谢你的收获。【参考方案3】:

尝试使用

xlApp.Application.Quit();

而不是

xlApp.Quit();

我最近遇到了完全相同的问题:)

【讨论】:

@Jon 感谢 Jon 的快速回复。我尝试了您的建议,但问题仍然存在,还有其他想法吗? 你不是必须强制GC之类的吗?我记得即使 Application.Quit() 也是不够的(我这里没有那个代码,所以我可能弄错了。) @Vinko:我没有,但我使用的是 .NET 4.0 - 也许这会有所不同? (我现在无法通过 Quit 而不是 Application.Quit 重现它出错了。我很想删除这个答案......)【参考方案4】:

Excel 是一个 COM 自动化服务器。

即使您调用 Application.Quit() 并释放对 COM 对象的引用,exe 本身也不会结束。您仍然可以在任务管理器中看到它。进一步调用 Excel 将使用正在运行的实例。

Excel 实例将在您的应用程序(线程、会话等)关闭后退出。

曾经收到“RPC 服务器未找到/正在运行”类型的 COM 错误吗?现在你知道为什么了。

另见(这已在 SO 上多次询问):

c# and excel automation - ending the running instance

【讨论】:

a) 为什么 GC.Collect 结束它(可靠且可重复)? b) “RPC server not found/running”与此有什么关系? 一个。为什么不呢?湾。这是适用于 Excel 等 COM 服务器的有趣信息。如果在关闭 Excel 并且未释放对它的引用后进一步调用 Excel,则可能会出现此错误。 a) 我是说 GC-ing 它,而不退出应用程序,结束 Excel 实例,你说只有在你的线程或应用程序结束后才有可能 b) 好的,现在这使得感觉。 a) “你所说的只有在你的线程或应用程序结束后才有可能” - noop,这不是我要说的。如果您使用 ReleaseComObject、FinalReleaseComObject 和 GC,则 Excel 实例将在您的应用程序关闭后退出,这可能是由隐式 GC 引起的,如果您有额外的好处,可以保持 RPC 服务器运行想给它打更多电话。

以上是关于为啥excel一直打开? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

将Excel单元格复制到打开/活动的Word文档

SAP系统用EXCEL导出数据为啥会是文本怎么转换成数值

为啥Excel无法打开二进制数据?

为啥打开EXcel表格时,总会出现正在安装microsoft excel功能

EXCEL查询无法运行或数据库无法打开是为啥

腾讯文档表格里为啥没有粘贴功能?