c# HttpGet响应给我一个空的Excel文件与EPPlus

本文关键字:一个 Excel 文件 EPPlus 响应 HttpGet | 更新日期: 2023-09-27 18:15:37

我已经创建了一个生成Excel文件的端点。如果我想要一些其他代码将其发送到另一个端点以发送电子邮件,或者如果我想通过在浏览器中手动点击端点来下载Excel文件,则应该使用GET功能。它正在下载Excel文件,但是当我试图打开它时,我看到消息"Excel无法打开文件'blahblah',因为文件格式或文件扩展名无效。确认文件未损坏,且文件扩展名与文件格式匹配。"

获得该错误后,我尝试改变我的响应内容字段和/或文件扩展名中的MIME类型,错误消失,文件打开并显示以下警告:"文件格式和扩展名"blah blah"不匹配。文件可能已损坏或不安全。除非你相信它的来源,否则不要打开它。你还想打开它吗?"如果我打开它,文件仍然是空的。

下面是我创建的ExcelPackage并将其添加到响应中的代码。

var response = HttpContext.Current.Response;
response.ContentType = "application/vnd.openxmlformats-  officedocument.spreadsheetml.sheet";
var fileName = string.Format("blahblah-{0}.xls",     InstantPattern.CreateWithInvariantCulture("yyyy-dd-M-HH-mm-ss").Format(_clock.Now));
response.AddHeader("content-disposition", string.Format("attachment; filename={0}", fileName));
response.BinaryWrite(excelPackage.GetAsByteArray());

我试过添加不同的mime类型,如应用程序/excel。我试过使用。xlsx文件扩展名而不是xls。什么都没起作用。我知道ExcelPackage工作簿的工作表实际上有我想要的数据,但是,因为当我调试和悬停在对象上时,我看到了我期望将其放入文件的单元格值。那么我做错了什么呢?

我试过以两种方式生成excelPackage,都是在using块内。这样的:

using (var excelPackage = new ExcelPackage())
{
    // generate and download excel file
}

还有这样的:

using (var excelPackage = new ExcelPackage(new FileInfo(fileName)))
{
   // generate and download excel file
}

c# HttpGet响应给我一个空的Excel文件与EPPlus

我使用这个将Excel文件发送到浏览器。

HttpResponse Response = HttpContext.Current.Response;
//first convert to byte array
byte[] bin = excelPackage.GetAsByteArray();
//clear the buffer stream
Response.ClearHeaders();
Response.Clear();
Response.Buffer = true;
//add the content type
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
//set the content length, without it, length is set to -1 and could give errors
Response.AddHeader("content-length", bin.Length.ToString());
//add a filename
Response.AddHeader("content-disposition", "attachment; filename='"" + fileName + ".xlsx'"");
//send the file to the browser
Response.OutputStream.Write(bin, 0, bin.Length);
//cleanup
Response.Flush();
HttpContext.Current.ApplicationInstance.CompleteRequest();