我有以下代码提示用户的浏览器下载excel文件。这是ASP.NET Web表单中的C#代码
byte[] fileData = GetExcelFile(..);
Response.Clear();
Response.ContentType = "application/vnd.ms-excel";
Response.AppendHeader("Content-Disposition", "attachment; filename=report.xlsx");
Response.OutputStream.Write(fileData, 0, fileData.Length);
Response.OutputStream.Flush();
Response.OutputStream.Close();
Response.Flush();
Response.Close();
Response.End();
当用户点击网站上的按钮时,会触发此代码。
它在IE11中完美运行;用户获取一个对话框,询问他们是否要保存或打开文件。该文件打开正常。
但是,在Chrome 56.0.2924.87(最新版本)上,用户会收到“失败 - 网络”和“无法加载响应数据”错误,并且没有任何内容在其计算机上下载。这段代码在一年多的时间里没有改变,并且已经工作了一年。但是,我昨天测试了它,它停止了工作。
这是将Excel文件作为回复发送给用户的推荐方式
答案 0 :(得分:1)
只需用Response.BinaryWrite写入数据,而不是刷新和关闭输出数据。
还要确保使用正确的内容类型。 xlsx
个文件是压缩的XML。 xlsx
文件的正确内容类型为application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
。
例如,假设使用EPPlus创建Excel文件:
private void DumpExcel(DataTable tbl)
{
using (ExcelPackage pck = new ExcelPackage())
{
//Create the worksheet
ExcelWorksheet ws = pck.Workbook.Worksheets.Add("Demo");
//Load the datatable into the sheet, starting from cell A1. Print the column names on row 1
ws.Cells["A1"].LoadFromDataTable(tbl, true);
byte[] fileData =pck.GetAsByteArray();
//Write it back to the client
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
Response.AddHeader("content-disposition", "attachment; filename=ExcelDemo.xlsx");
Response.BinaryWrite(pck.GetAsByteArray());
}
}
您可能需要致电Response.End();
以阻止服务器在同一响应中发送您网页的其余部分。
另一种选择是使用ExcelPackage.SaveAs(Stream)
将文件直接写入输出流。这消除了临时缓冲区:
pck.SaveAs(Response.OutputStream);
答案 1 :(得分:0)
您可以尝试一下
Response.Buffer = true;
Response.Clear();
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
Response.AddHeader("Content-Disposition", "attachment; filename=yourExcelFileName.xlsx;");
Response.BinaryWrite(yourByteArray);
Response.End();