我们使用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 Productivity Tool中打开了电子表格,然后通过验证。
答案 0 :(得分:6)
以下是微软支持部门在http://support.microsoft.com/kb/213428处回答的类似问题的回复 “要在不保存任何更改的情况下强制关闭工作簿,请在该工作簿的Visual Basic模块中键入以下代码:
Sub Auto_Close()
ThisWorkbook.Saved = True
End Sub
由于Saved属性设置为True,因此Excel会像保存工作簿一样进行响应,并且自上次保存以来未发生任何更改。“
希望有所帮助。
答案 1 :(得分: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);
}
答案 2 :(得分:2)
我不确定EPPLus,但Excel Interop会让你静音这些警报。
var xlApp = new Excel.Application();
xlApp.DisplayAlerts = false;
然后,Excel将选择默认响应。
答案 3 :(得分:1)
尝试升级到最新版本。从版本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将应用自己的格式,但我不再在简单的工作表中看到它。
答案 4 :(得分:1)
转动" 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();