【问题标题】:C# how to close excel application in Excel VSTO AddInC#如何在Excel VSTO AddIn中关闭excel应用程序
【发布时间】:2019-02-12 10:04:00
【问题描述】:
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应用程序? my excel appear like this

【问题讨论】:

  • 这个问题并不完全清楚。是否涉及 Excel + VSTO 加载项以外的其他应用程序?您说“将由应用程序打开 Excel 文档进行编辑”:什么应用程序以及如何打开 Excel 文件?请具体说明,因为这可能会影响您应该/可以做什么。 Excel 无法完全退出的原因是代码在in Excel 中运行,因此退出 Excel 并不允许代码完成。此外,VSTo 代码应该从不在 VSTO 应用程序上显式使用 ReleaseComObject。
  • @CindyMeister 感谢您的回复。是否涉及 Excel + VSTO 加载项以外的其他应用程序?不,Excel文件是如何打开的?我在 DocuShare 中上传了一个 Excel 文档。我正在从 DocuShare 打开文档以在编辑模式下进行编辑。在这里,我将从文件中获取 base64 并将 base64 写入文件 File.WriteAllBytes(@"location", convert.FromBase64String(yourBase64String));现在文档就在这个位置创建好了,我是用Microsoft.Office.Interop.Excel.Workbook Open来打开文档的。
  • @CindyMeister 所以退出 Excel 不允许代码完成 - 那么我如何在 Excel vsto 中关闭应用程序,还有其他方法吗?
  • 当您说您使用“互操作”打开文档时,代码在哪里运行?在 VSTO 项目中还是在其他地方?什么是启动 Excel 应用程序?作为用户,您是这个 DocuShare(我不熟悉)还是其他地方的代码?
  • 嗨,让我们忘记我给出的所有内容,这很令人困惑。如何关闭excel插件中的excel应用程序?我创建了 vsto 插件,在关闭文档事件时,我的弹出窗口将出现保存而不是保存按钮。我正在打开一个文档并对其进行编辑。单击文档关闭时,将出现我的弹出窗口如果我单击保存文档将被保存位置。如果我单击不保存,则不应保存更改并且必须关闭应用程序。我知道默认的 excel 保存弹出窗口都是可能的,但我想使用我自己的弹出窗口

标签: excel vsto


【解决方案1】:

以下代码适用于我,但重要的是要记住,插件技术并不是真正通过从插件中退出主机应用程序而创建的。因此,“您的里程可能会有所不同”。

与问题中的代码不同,这不使用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;
    }

【讨论】:

  • 感谢您的回答。您的答案很好,但会关闭所有文档。考虑一下,我打开了 2 个文档来编辑并编辑了 2 个文档。如果我关闭第一个文档,我的弹出窗口会出现,如果我单击不保存(否),它实际上会关闭活动文档,这很好。但它也会关闭另一个文档而不显示弹出。当我只需要关闭活动文档时,我们无法关闭每个循环中的所有文档。
  • @naveenkumar 当我询问详细信息时,该要求不是问题的一部分,也不是 cmets 的一部分。怎么会有人知道呢?这个问题给人的印象正好相反。只需更改建议的代码以适应您的实际需要。重要的是在没有任何文档打开时退出并正确释放对象。
【解决方案2】:

已在 Stack Overflow 上回复,see if it helps you

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

【讨论】:

  • 感谢您的回答,我在这里尝试了几种可能性,但没有奏效
  • 这不是 VBA,这是 Visual Studio Tools for Office 加载项中的 C#。适用不同的规则。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多