EPPlus:我怎么有两个excelpackage . savea ?



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

为什么不以相反的方式看待它呢?首先在服务器上保存生成的文件,然后将保存的文件传输到客户端。

  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:UserstestaccDesktopTest" + 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();

最新更新