C # как закрыть приложение Excel в Excel VSTO AddIn - PullRequest
0 голосов
/ 12 февраля 2019
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 выглядит так

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Следующий код работает для меня, но важно иметь в виду, что технология надстройки на самом деле не была создана с выходом из хост-приложения из надстройки.Таким образом, «ваш пробег может отличаться».

В отличие от кода в вопросе, он не использует 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;
    }
0 голосов
/ 12 февраля 2019

Уже ответил на переполнение стека, посмотрим, поможет ли это вам

Как указано выше, для выхода из Excel требуется вызов метода Quit из кода VBA.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...