EPPlus:我怎么有 2 ExcelPackage.SaveAs?
EPPlus: How do I have 2 ExcelPackage.SaveAs?
我正在使用 EPPlus 导出到 Excel 功能。我需要 2 个 SaveAs,第一个 SaveAs 是一个允许用户 Open/Save/SaveAs 的保存对话框,我的第二个 SaveAs 允许 Excel 文件作为备份副本直接保存到服务器中的指定文件夹中.
因此我的问题是我的第二个另存为不起作用(调试期间没有错误弹出窗口,没有为第二个另存为生成任何文件)。
请指教。谢谢!
ExcelPackage package = new ExcelPackage();
.....
code for loading data table
.....
var filename = @"REPORT_" + datetime.ToString("dd-MM-yyyy_hh-mm-ss") + ".xlsx";
以下代码有效(我的第一个 SaveAs 供用户选择 Open/Save/SaveAs):
Response.Clear();
package.SaveAs(Response.OutputStream);
Response.AddHeader("content-disposition", "attachment; filename=" + filename + ";");
Response.Charset = "";
Response.ContentType = "application/vnd.xlsx";
Response.End();
下面的代码不起作用(我的第二个 SaveAs 将文件直接保存到服务器):
string path = @"C:\Users\testacc\Desktop\Test\" + 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:\Users\testacc\Desktop\Test\" + 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();
我正在使用 EPPlus 导出到 Excel 功能。我需要 2 个 SaveAs,第一个 SaveAs 是一个允许用户 Open/Save/SaveAs 的保存对话框,我的第二个 SaveAs 允许 Excel 文件作为备份副本直接保存到服务器中的指定文件夹中.
因此我的问题是我的第二个另存为不起作用(调试期间没有错误弹出窗口,没有为第二个另存为生成任何文件)。
请指教。谢谢!
ExcelPackage package = new ExcelPackage();
.....
code for loading data table
.....
var filename = @"REPORT_" + datetime.ToString("dd-MM-yyyy_hh-mm-ss") + ".xlsx";
以下代码有效(我的第一个 SaveAs 供用户选择 Open/Save/SaveAs):
Response.Clear();
package.SaveAs(Response.OutputStream);
Response.AddHeader("content-disposition", "attachment; filename=" + filename + ";");
Response.Charset = "";
Response.ContentType = "application/vnd.xlsx";
Response.End();
下面的代码不起作用(我的第二个 SaveAs 将文件直接保存到服务器):
string path = @"C:\Users\testacc\Desktop\Test\" + 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:\Users\testacc\Desktop\Test\" + 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();