C#:Chrome - 用户下载excel文件

时间:2017-02-23 18:06:58

标签: c# asp.net excel webforms

我有以下代码提示用户的浏览器下载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文件作为回复发送给用户的推荐方式

2 个答案:

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