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

为什么不看一下,反过来实现,顺序相反。先将生成的文件保存在服务器上,再将保存的文件传给客户端。

  1. 创建包

    ExcelPackage package = new ExcelPackage();
    .....
    code for loading data table
    .....
    var filename = @"REPORT_" + datetime.ToString("dd-MM-yyyy_hh-mm-ss") + ".xlsx";
    
  2. 保存到服务器

    string path = @"C:\Users\testacc\Desktop\Test\" + filename +";";
    Stream stream = File.Create(path);
    package.SaveAs(stream);
    stream.Close();
    
  3. 将保存的文件传输到客户端

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