使用Excel Interop关闭Excel应用程序而不保存消息

时间:2013-11-14 12:12:37

标签: c# excel com excel-interop

我正在使用Excel Interop COM对象。 我正在编写一种方法,在其中打开和关闭Excel应用程序,然后打开Excel工作簿和工作表。在我完成它们之后,我正在关闭应用程序和工作簿。 我的问题是这个方法可以重复调用几次,当工作表和应用程序关闭时,如果我想保存我所做的更改,我会从Excel应用程序中获取一条消息。该方法一直停滞,直到我按“否”,但我无法告诉用户每次都按下它。

如何在不收到此消息的情况下关闭应用程序或至少通过代码回答它?

这些是我用来关闭应用程序和工作簿的方法:

private void FreeWorkSheetResources(Excel.Worksheet sheet)
{
  Marshal.ReleaseComObject(sheet);
  sheet = null;
}

private void FreeWorkBookResources()
{
  if (_excelSheets != null)
  {
    Marshal.ReleaseComObject(_excelSheets);
    _excelSheets = null;
  }
  _excelWorkBook.Close();
  Marshal.ReleaseComObject(_excelWorkBook);
  _excelWorkBook = null;
}

private void FreeApplicationResources()
{
  _app.Quit();
  Marshal.ReleaseComObject(_app);
  _app = null;
  GC.Collect();
}

这就是我使用它们的方式:

if (_app == null)
  {
    _app = new Excel.Application();
  }
  if (_excelWorkBook == null)
  {
    _excelWorkBook = GetWorkBook(_filePath);
  }
  ....
  ....
  FreeWorkBookResources();
  FreeApplicationResources();

5 个答案:

答案 0 :(得分:8)

关闭Excel工作簿时,您可以使用以下语句:

object misValue = System.Reflection.Missing.Value;
xlWorkBook.Close(false, misValue, misValue);

答案 1 :(得分:2)

关闭工作簿时执行此操作。

_excelWorkBook.Close(true);

答案 2 :(得分:2)

试试这个:

excelApp.DisplayAlerts = False;
//save and close your workbook
excelApp.DisplayAlerts = True;

答案 3 :(得分:2)

我的问题很相似。我需要生成Excel Sheet,然后将其转换为PDF。我的问题是Excel应用程序显示并通知我在退出之前保存。解决方案是设置.Visible = flase.DisplayAlerts = False

感谢@adil

答案 4 :(得分:0)

我遇到了这个问题,在打开并读取没有编辑的Excel文件后仍然显示保存对话框。

设置

xlApplication.Visible = false;
xlApplication.DisplayAlerts = false;

并使用SaveChanges参数关闭工作簿为false

xlWorkbook.Close(false, Missing.Value, Missing.Value);

也没用。我正在使用Excel文件类型.xlsb(带有宏的二进制文件),当我保存为.xlsx(没有宏)时.Close方法有效。保存为.xslm(带有宏的xslx)给了我同样的显示保存对话框的问题。

我转向VBA for Excel上的MS支持站点,发现这篇文章https://support.microsoft.com/en-us/help/213428/how-to-suppress-save-changes-prompt-when-you-close-a-workbook-in-excel详细说明了如何在不保存VBA宏的情况下完成关闭。适应C#我明确地将Saved属性设置为true。以下使用.xlsx,.xlsm,.xlsb文件类型为我工作。

        Excel.Application xlApp = new Excel.Application();
        xlApp.DisplayAlerts = false;
        xlApp.Visible = false;
        var xlWorkbook = xlApp.Workbooks.Open(fileInfo.FullName);

        // do work

        xlWorkbook.Saved = true;
        xlWorkbook.Close(false, Missing.Value, Missing.Value);
        xlApp.Quit();