我使用EPPlus为我的导出到Excel功能。我需要有2个savea,第一个savea是一个保存对话框,允许用户打开/保存/savea和我的第二次savea,允许Excel文件被直接保存到指定的文件夹在服务器作为备份副本。
因此我的问题是我的第二次保存不工作(调试期间没有错误弹出,也没有文件生成的第二次保存)。
请建议。谢谢!
ExcelPackage package = new ExcelPackage();
.....
code for loading data table
.....
var filename = @"REPORT_" + datetime.ToString("dd-MM-yyyy_hh-mm-ss") + ".xlsx";
下面的代码工作(我的第一个savea用户选择打开/保存/savea):
Response.Clear();
package.SaveAs(Response.OutputStream);
Response.AddHeader("content-disposition", "attachment; filename=" + filename + ";");
Response.Charset = "";
Response.ContentType = "application/vnd.xlsx";
Response.End();
下面的代码不工作(我的第二次savea保存文件直接保存到服务器):
string path = @"C:UserstestaccDesktopTest" + filename +";";
Stream stream = File.Create(path);
package.SaveAs(stream);
stream.Close();
byte[] data = File.ReadAllBytes(path);
为什么不以相反的方式看待它呢?首先在服务器上保存生成的文件,然后将保存的文件传输到客户端。
-
创建包
ExcelPackage package = new ExcelPackage(); ..... code for loading data table ..... var filename = @"REPORT_" + datetime.ToString("dd-MM-yyyy_hh-mm-ss") + ".xlsx";
-
保存到服务器
string path = @"C:UserstestaccDesktopTest" + filename +";"; Stream stream = File.Create(path); package.SaveAs(stream); stream.Close();
-
发送保存的文件到客户端
try { response.Clear(); response.ContentType = "application/vnd.xlsx"; response.AddHeader("content-disposition", "attachment; filename=" + filename + ";"); response.TransmitFile(path); response.Flush(); } catch (Exception ex) { // any error handling mechanism } finally { HttpContext.Current.ApplicationInstance.CompleteRequest(); }
任何时候在EPPlus中调用.Save
, .SaveAs
或.GetAsByteArray()
(可能是其他),它们都有关闭包的副作用。因此,您需要通过执行package = new ExcelPackage..
之类的操作来重新构建包,并以某种方式重新读取文件。
既然你已经在内存中有包,为什么不直接复制字节并保存两次以避免额外的IO访问。像这样:
ExcelPackage package = new ExcelPackage();
var workbook = package.Workbook;
var hoja = workbook.Worksheets.Add("Sheet1");
//Copy the package in memory
byte[] data = package.GetAsByteArray();
//Write to web
Response.OutputStream.Write(data, 0, data.Length);
//Write to file
var filename = @"REPORT_" + DateTime.Now.ToString("dd-MM-yyyy_hh-mm-ss") + ".xlsx";
path = @"C:temp" + filename + ";";
stream = File.Create(path);
stream.Write(data, 0, data.Length);
stream.Close();