试图closures电子表格时,Excel会询问用户是否保存更改

我们使用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(); } 

当用户打开电子表格时,一切都很正常。 当他们尝试closures电子表格而未做任何更改时,Excel会询问他们是否要保存更改。 这不是太大的交易,但它是烦人的,有点担心。

我已经在OpenXML SDK生产力工具中打开了电子表格,并通过了validation。

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

Sub Auto_Close()

ThisWorkbook.Saved = True

结束小组

因为Saved属性设置为True,所以Excel响应,就像工作簿已经保存一样,自上次保存以来没有发生任何更改。

希望有所帮助。

一种解决scheme是在用EPPlus保存文件后,用Interop Excel做一个忍者式的开放式保存closures。 就像是:

 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); } 

我不确定EPPLus,但是Excel Interop可以让你消除这些警报。

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

Excel将会select默认的响应。

尝试升级到最新版本。 从版本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将应用自己的格式,但我不会在简单的表格中看到它。

closures时closures“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();