6

我正在使用 Excel 互操作 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();
4

5 回答 5

13

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

object misValue = System.Reflection.Missing.Value;
xlWorkBook.Close(false, misValue, misValue);
于 2013-11-14T12:27:37.850 回答
5

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

感谢@adil

于 2014-06-25T11:04:31.640 回答
3

尝试这个:

excelApp.DisplayAlerts = False;
//save and close your workbook
excelApp.DisplayAlerts = True;
于 2013-11-14T13:27:14.947 回答
2

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

_excelWorkBook.Close(true);
于 2013-11-14T12:19:42.040 回答
1

我遇到了这个问题,在打开和读取 Excel 文件而不进行编辑后仍然显示保存对话框。

环境

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

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

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

也没有用。我正在使用 .xlsb(带宏的二进制文件)的 Excel 文件类型,当我保存为 .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();
于 2018-05-01T19:56:13.890 回答