无法从我的代码关闭excel

本文关键字:excel 代码 我的 | 更新日期: 2023-09-27 17:49:35

有个小问题。我通过互操作包装打开一个excel电子表格。我需要在文档再次关闭时拦截并提示用户。我的问题是,excel从来没有关闭,不知何故,我一直有参考的东西。我尝试了我能找到的所有教程,阅读了所有的博客文章,但我一定错过了什么。下面是我的代码(请注意,所有内容都被注释掉了,现在我杀死了所有进程-这不是期望的行为):

private Action currentCallback;        
Microsoft.Office.Interop.Excel.Application appExcel;
public bool OpenDocumentWithCallback(string path, Action callbackMethod)
{
    bool result = true;
    try
    {
        currentCallback = callbackMethod;
        appExcel = new Application();
        appExcel.Visible = true;
        Workbooks books = appExcel.Workbooks;
        Microsoft.Office.Interop.Excel.Workbook docExcel = books.Open(Filename: path, ReadOnly: false);
        appExcel.WorkbookBeforeClose += appExcel_WorkbookBeforeClose; // <-- hooking the event
    }
    catch (Exception ex)
    {
        result = false;
        LogEntry.GetLogInterface().WriteDebugExceptionEntry(ex.ToString(), ex, SystemData.LogLevel.Critical);
    }
    return result;
}
void appExcel_WorkbookBeforeClose(Workbook Wb, ref bool Cancel)
{
    GC.Collect();
    GC.WaitForPendingFinalizers();
    Wb.Close();
    //Marshal.FinalReleaseComObject(Wb);
    //appExcel.Visible = false;
    //KillExcel(GetExcelProcess());
    MurderAllExcelProcesses(); <--- last resort - killing all processes
    //appExcel.Quit();                        
    //Marshal.FinalReleaseComObject(appExcel);
    currentCallback(); //<-- after this delegate is called i cannot access the excel file because it is in use by another application ???
}

请大家帮忙解决这个问题。

无法从我的代码关闭excel

尝试使用using() Block打开工作簿等!这将关闭并释放所有资源。

您从未设置appExcel = null(您可能需要将工作簿引用设置为null)。您应该在显式调用任何垃圾收集之前这样做(这实际上应该是不必要的)。

尽量不要终止excel进程:例如,excel 2013通常在一个可执行文件中运行多个excel会话。如果你关闭这样的会议,你可能会让自己不受欢迎。