关闭Excel应用程序时使用Excel Interop不显示保存消息

7
我正在使用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();

那么你没有保存你在工作表上所做的更改,对吗? - Sudhakar Tillapudi
我只是从工作表中读取数据,没有进行任何更新。我不知道他为什么要问我是否要保存任何更改。 - CodeMonkey
重复问题:Trying to exit C# Excel Workbook without a dialog box。请使用搜索功能。 - CodeCaster
5个回答

14

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

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

1
实际上,您甚至不需要创建一个变量。以下代码对我有效:xlWorkBook.Close(false, Missing.Value, Missing.Value); - Gerhard Powell

5
我的问题与此类似。我需要生成Excel表格,然后将其转换为PDF。我的问题是Excel应用程序在退出前显示并通知我保存。解决方法是设置.Visible = flase.DisplayAlerts = False。感谢@adil的帮助。

这对我有用!语法是“myExcel.Visible = false; myExcel.DisplayAlerts = false;” - blackorchid

3

试试这个:

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

2

关闭工作簿时,请执行以下操作。

_excelWorkBook.Close(true);

这对我有用。被接受的答案损坏了我的文件(我不知道为什么)。 - sudo rm -rf slash

1
我可以帮助您翻译这段内容。这段文字是关于编程方面的内容,提到了一个问题:在打开并查看 Excel 文件时,保存对话框仍然显示的问题。
同时,这段文字还提到了“设置”的部分。
xlApplication.Visible = false;
xlApplication.DisplayAlerts = false;

关闭工作簿时,将SaveChanges参数设置为false。
xlWorkbook.Close(false, Missing.Value, Missing.Value);

也没起作用。我正在使用一个 .xlsb(带有宏的二进制)Excel 文件类型,当我另存为 .xlsx(不带宏)时,.Close 方法起作用了。将其保存为 .xslm(带宏的 xslx)会出现相同的保存对话框问题。

我转向了 Excel 的 VBA 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();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接