【问题标题】:Closing Excel application with Excel Interop without save message使用 Excel Interop 关闭 Excel 应用程序而不保存消息
【发布时间】:2013-11-27 10:40:27
【问题描述】:

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

【问题讨论】:

  • 所以您没有保存您在工作表上所做的更改,对吧?
  • 我只是从工作表中读取,而不是更新它。我不知道他为什么还要问我是否要保存任何更改

标签: c# excel com excel-interop


【解决方案1】:

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

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

【讨论】:

  • 您实际上甚至不需要创建变量。以下对我有用:xlWorkBook.Close(false, Missing.Value, Missing.Value);
【解决方案2】:

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

感谢@adil

【讨论】:

  • 这对我有用!语法是“myExcel.Visible = false; myExcel.DisplayAlerts = false;”
【解决方案3】:

试试这个:

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

【讨论】:

    【解决方案4】:

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

    _excelWorkBook.Close(true);
    

    【讨论】:

    • 这对我有用。接受的答案损坏了我的文件(idk 如何)。
    【解决方案5】:

    我遇到了这个问题,在打开和读取 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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-30
      • 2016-11-25
      • 2011-04-07
      • 1970-01-01
      • 2012-10-14
      • 1970-01-01
      相关资源
      最近更新 更多