使用 webforms 和 EPPlus 下载文件

Downloading a file with webforms and EPPlus

我正在为遗留的 webforms 应用程序实现一个小的导出功能。

我现在的导出代码只有headers(只是测试我可以成功创建一个文件):

public MemoryStream Export()
{
    var result = new MemoryStream();
    using (var p = new ExcelPackage())
    {
        var ws = p.Workbook.Worksheets.Add("Contacts");
        var col = 1;
        ws.Cells[1, col++].Value = "ID";
        ws.Cells[1, col++].Value = "First Name";
        ws.Cells[1, col++].Value = "Last Name";
        ws.Cells[1, col++].Value = "Email";
        ws.Cells[1, col++].Value = "Phone";
        ws.Cells[1, col++].Value = "Address";
        p.SaveAs(result);
    }

    return result;
}

这是按钮处理程序:

var ms = Export();
ms.WriteTo(HttpContext.Current.Response.OutputStream);
HttpContext.Current.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
HttpContext.Current.Response.AddHeader("Content-Disposition", $"attachment;filename=Contacts_{DateTime.Now:yyyyMMddhhmmss}.xlsx");
HttpContext.Current.Response.StatusCode = 200;
// HttpContext.Current.Response.End();

所以一个问题是我找到的所有示例在方法末尾都有 HttpContext.Current.Response.End() 调用,但是如果我这样做,它会抛出异常。注释掉这一行似乎工作正常,但这导致了我的主要问题:当文件被保存然后在 excel 中打开时,Excel 抱怨文件有问题。我的印象是 EPPlus 生成格式正确的文件,所以我错过了什么?

更新 #1 我尝试直接将 EPPlus 包保存到磁盘。这似乎没有问题。所以问题出在将包写入内存流和返回结果之间。

这是适合我的代码

var ms = Export();
Response.Clear();
HttpContext.Current.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
HttpContext.Current.Response.AddHeader("Content-Disposition", $"attachment;filename=Contacts_{DateTime.Now:yyyyMMddhhmmss}.xlsx");
Response.AddHeader("Content-Length", ms.Length.ToString());
Response.BinaryWrite(ms.ToArray());
Response.End();