C# 如何在 Excel VSTO AddIn 中关闭 Excel 应用程序


I have created an Excel VSTO Addin which will show a message box with yes, no and cancel as button options on the close event of Current document.

我已经打开了 2 个 excel 文档进行编辑。完成编辑后,我尝试关闭其中一个,当我单击文档关闭按钮时,将出现我的消息框。如果我单击"否",则应丢弃所有更改并关闭文档。其他文件不应关闭。

这是我在"不保存"操作中使用的代码

private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
    this.Application.WorkbookBeforeClose += Application_WorkbookBeforeClose;
}
private void Application_WorkbookBeforeClose(Excel.Workbook Wb, ref bool Cancel)
{
    DialogResult result = MessageBox.Show("Do you want to save changes to " + Wb.Name + "?", "Microsoft Excel ", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);
    switch (result)
    {
        case DialogResult.Yes:
            Wb.Save();
            break;
        case DialogResult.No:
            int count = this.Application.Workbooks.Count;
            if(count > 0)
            {
                if (count == 1)
                {
                    Excel.Application excel =Globals.ThisAddIn.Application;
                    Workbooks workbooks = excel.Workbooks;
                    foreach (Workbook wb in workbooks)
                    {
                        wb.Close(false, missing, missing);
                    }
                    workbooks = null;
                    excel.Quit();
                    excel = null;
                }
                else
                {
                    Wb.Close(false, missing, missing);
                }
            }
            break;
        case DialogResult.Cancel:
            Cancel = true;
            break;
    }
}

如果打开了多个 Excel 文档进行编辑,则 Excel vsto 加载项应关闭在其中执行关闭操作的特定 Excel 文档,而其他文档应保持打开状态。我的方法关闭文档,但不关闭应用程序。如何完全关闭Excel应用程序?我的 excel 如下所示

以下代码对我有用,但请务必记住,外接程序技术并不是通过退出外接程序内的主机应用程序而真正创建的。因此,"您的里程可能会有所不同"。

与问题中的代码不同,这不使用Marshal.ReleaseComObject。此方法是"最后的手段",并强制立即释放对象。强制释放对象后,代码将无法再使用它 - 但 VSTO 需要执行其内部清理。仅当释放 COM 对象的标准方法未执行该作业时,才应使用此方法。在任何情况下,VSTO 作为其对开发人员的"服务"的一部分,负责在项目中正确声明和实例化的 COM 对象的标准发布。因此,实际上,将对象设置为不再需要时null就足够了,这会释放它们以进行标准垃圾回收。当 VSTO 进程外时,对象最迟将在 COM 级别释放。

    private void btnQuitExcel_Click(object sender, RibbonControlEventArgs e)
    {
        Excel.Application xlApp = Globals.ThisAddIn.Application;
        Excel.Workbooks wbs = xlApp.Workbooks;
        int nrWbs = wbs.Count;
        if (nrWbs > 0)
        {
            foreach (Excel.Workbook wb in wbs)
            {
                wb.Close(false, missing, missing);
            }
        }
        wbs = null;
        xlApp.Quit();
        xlApp = null;
    }

已经在堆栈溢出上回答了,看看它是否对您有帮助

如上所述,退出 Excel 需要从 VBA 代码中调用 Quit 方法。

最新更新