【问题标题】:When trying to close a spreadsheet, Excel asks user whether to save changes尝试关闭电子表格时,Excel 会询问用户是否保存更改
【发布时间】:2015-02-10 04:42:33
【问题描述】:

我们使用 EPPlus 生成大量 Excel 电子表格报告。

代码通常是这样的:

var workbookFile = new FileInfo(reportFile);
using (var excel = new ExcelPackage(workbookFile))
{
    var wb = excel.Workbook;
    var ws = wb.GetCleanWorksheet("Report");
    ws.Select();

    // write data to sheet
    ws.Cells[1, 1].Value = "foo";

    excel.Save();
}

当用户打开电子表格时,一切看起来都很好。当他们尝试在未进行任何更改的情况下关闭电子表格时,Excel 会询问他们是否要保存更改。这没什么大不了的,但它很烦人,而且有点令人担忧。

我在 OpenXML SDK 生产力工具中打开了电子表格,它们通过了验证。

【问题讨论】:

  • 感谢您的发现。想要快速回答以便我接受吗? (除非有人想做出更彻底的答案,从而生成缓存的公式结果并将它们直接粘贴到 XML 中......)
  • 如果您链接的单元格从另一个文档中获取值,即使没有更改,它也会始终要求您保存更改。它将单元格更新计为值更改,如果还有其他一些情况我不记得了。

标签: c# excel epplus


【解决方案1】:

这是对 Microsoft 支持http://support.microsoft.com/kb/213428 回答的类似问题的回复 "要强制关闭工作簿而不保存任何更改,请在该工作簿的 Visual Basic 模块中键入以下代码:

Sub Auto_Close()

ThisWorkbook.Saved = True

结束子

由于 Saved 属性设置为 True,Excel 的响应就好像工作簿已经保存并且自上次保存后未发生任何更改。"

希望对您有所帮助。

【讨论】:

    【解决方案2】:

    一种解决方案是在使用 EPPlus 保存文件后使用 Interop Excel 执行忍者风格的打开-保存-关闭。比如:

    using Excel = Microsoft.Office.Interop.Excel;
    
    var workbookFile = new FileInfo(reportFile);
    using (var excel = new ExcelPackage(workbookFile))
    {
        var wb = excel.Workbook;
        var ws = wb.GetCleanWorksheet("Report");
        ws.Select();
    
        // write data to sheet
        ws.Cells[1, 1].Value = "foo";
    
        excel.Save();
    }
    Excel.Application _Excel = null;
    Excel.Workbook WB = null;
    try
    {
    
        _Excel = new Microsoft.Office.Interop.Excel.Application();
        WB = _Excel.Workbooks.Open(reportFile);
        _Excel.DisplayAlerts = false;
        WB.Close(true);
    }
    catch (Exception ex)
    {
        WB.Close(false);
    }
    finally
    {
        GC.Collect();
        GC.WaitForPendingFinalizers();
        System.Runtime.InteropServices.Marshal.FinalReleaseComObject(WB);
        System.Runtime.InteropServices.Marshal.FinalReleaseComObject(_Excel);
    }
    

    【讨论】:

    • 您和@thatkindofmatt 的答案都取决于 Interop :(
    • 根据原始帖子中的链接评论,不确定您是否可以在不实际打开 Excel 的情况下通过它......也许更好的解决方案是不要使用公式......
    【解决方案3】:

    我不确定 EPPLus,但 Excel 互操作可以让您静音这些警报。

    var xlApp = new Excel.Application();
    xlApp.DisplayAlerts = false;
    

    Excel 将选择默认响应。

    【讨论】:

    • 这会很好.. 但是现在要在服务器中运行 Interop 需要更改一些安全属性...甚至 Microsoft 建议不要使用它:(
    【解决方案4】:

    尝试升级到最新版本。从 4.0.4.0 版开始,这似乎不是简单工作表的问题。不过语法有点不同:

    var workbookFile = new FileInfo(reportfile);
    using (var excel = new ExcelPackage(workbookFile))
    {
        ExcelWorksheet ws = excel.Workbook.Worksheets.Add("Report");
        ws.Cells[1, 1].Value = "foo";
        excel.Save();
    }
    

    Excel 不会要求我保存任何内容(除非我更改某些内容)。请注意,由于该文件尚未通过 Excels DOM 运行,您看到的行为在复杂的工作簿中仍然有些预期,因为 Excel 将应用自己的格式,但我不再在简单的工作表中看到它。

    【讨论】:

      【解决方案5】:

      关闭时关闭“DisplayAlerts”。这可以通过集成的 VBA 脚本来完成。只需添加以下代码(workbook 是您当前的工作簿):

      workbook.CreateVBAProject();
      workbook.CodeModule.Name = "DisplayAlertsOff";
      StringBuilder sb = new StringBuilder();
      sb.AppendLine("Sub CloseBook()");
      sb.AppendLine("    Application.DisplayAlerts = False");
      sb.AppendLine("    ActiveWorkbook.Close");
      sb.AppendLine("    Application.DisplayAlerts = True");
      sb.AppendLine("End Sub");
      workbook.CodeModule.Code = sb.ToString();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多