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
答案 0 :(得分:0)
以下代码对我有用,但请务必记住,并不是真正从外接程序中退出主机应用程序创建外接程序技术的。因此,“您的里程可能会有所不同。”
与问题中的代码不同,它不使用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;
}
答案 1 :(得分:-1)
已经对堆栈溢出see if it helps you
进行了回答如上所述,要退出Excel,需要从VBA代码中调用Quit方法。