无法在IE 11中导出到Excel

时间:2015-03-19 17:43:07

标签: asp.net internet-explorer export-to-excel internet-explorer-11

我有一个Web应用程序,可以将数据从gridview导出到Excel。它在Chrome中运行良好,但在IE 11和Firefox中不起作用。我在google时发现了很多问题,但这个错误似乎是独一无二的。

protected void ExportToExcel(List<MapAmericas.Model.Project> Projects)
{
    Response.Clear();
    Response.Buffer = true;
    Response.ContentType = "application/vnd.ms-excel";
    Response.ContentEncoding = System.Text.Encoding.Unicode;
    Response.AddHeader("content-disposition", "attachment;filename=MyFile" + DateTime.Now.ToString() + ".xls");
    Response.Charset = "";
    Response.BinaryWrite(System.Text.Encoding.Unicode.GetPreamble());
    this.EnableViewState = false;

    System.IO.StringWriter sw = new System.IO.StringWriter();
    System.Web.UI.HtmlTextWriter htw = new System.Web.UI.HtmlTextWriter(sw);

    GridView gv = new GridView();
    gv.AutoGenerateColumns = false;
    gv.RowDataBound += new GridViewRowEventHandler(dataExportExcel_ItemDataBound);

    gv.DataSource = Projects;
    gv.DataBind();

    gv.RenderControl(htw);
    Response.Write(AddExcelStyling()); //this contains the opening html elements
    StringBuilder sbResponseString = new StringBuilder();
    sbResponseString.Append(sw + "</body></html>");
    Response.Write(sbResponseString.ToString());
    Response.Flush();
    Response.Close();
    Response.End();
}

...我遇到的问题与无法访问Internet临时文件有关。我得到一个弹出窗口“加载期间的问题”和大约十几个条目:“丢失文件...临时Internet文件\内容\”然后我收到一条消息“无法读取文件”。 我有一个图像来表示错误,但我无法上传图像。 当我点击其中一个链接时,它会加载我的网页而没有任何样式,我没有得到一个excel文件。 有谁知道这个问题会是什么?

2 个答案:

答案 0 :(得分:0)

我明白了!我在现有代码中添加了2行代码并且可以正常运行。请参阅标有**:

的行
HttpContext.Current.Response.Clear();
        HttpContext.Current.Response.Buffer = true;
        //HttpContext.Current.Response.ContentType = "application/vnd.ms-excel";
        HttpContext.Current.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
        HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.Unicode;
        HttpContext.Current.Response.AddHeader("content-disposition", "attachment;filename=Panorama_Project-" + DateTime.Now.ToString() + ".xls");

        HttpContext.Current.Response.Charset = "";
        HttpContext.Current.Response.BinaryWrite(System.Text.Encoding.Unicode.GetPreamble());
        this.EnableViewState = false;

        System.IO.StringWriter sw = new System.IO.StringWriter();
        System.Web.UI.HtmlTextWriter htw = new System.Web.UI.HtmlTextWriter(sw);

        GridView gv = new GridView();
        gv.AutoGenerateColumns = false;

        gv.RowDataBound += new GridViewRowEventHandler(dataExportExcel_ItemDataBound);

        gv.DataSource = Projects;
        gv.DataBind();

        gv.RenderControl(htw);
        HttpContext.Current.Response.Write(AddExcelStyling());
        StringBuilder sbResponseString = new StringBuilder();
        sbResponseString.Append(sw + "</body></html>");
        **HttpContext.Current.Response.AddHeader("Content-Length", sbResponseString.Length.ToString());**
        HttpContext.Current.Response.Write(sbResponseString.ToString());
        //HttpContext.Current.Response.Flush();
        //HttpContext.Current.Response.Close();
        //HttpContext.Current.Response.End();
        **System.Web.HttpContext.Current.ApplicationInstance.CompleteRequest();**

好像它正在尝试显示包含我的页面和所有链接资源的整个Response对象。 Content-Length并用System.Web.HttpContext.Current.ApplicationInstance.CompleteRequest()替换Reponse.End和Response.Flush似乎可以解决问题。

答案 1 :(得分:-1)

这是我使用的导出到Excel功能(对于数据表)的简化版本,以及适用于所有浏览器的版本。看看这是否有帮助。代码与你的代码非常相似:

public void ExportDataToExcel(String FileName, DataTable dtData)
{
    // get gridview out of datatable
    GridView gv = new GridView();
    gv.AllowPaging = false;
    gv.DataSource = dtData;
    gv.DataBind();

    HttpContext.Current.Response.Clear();
    HttpContext.Current.Response.Buffer = true;
    HttpContext.Current.Response.AddHeader("content-disposition",
        "attachment;filename=" + FileName + ".xls");
    HttpContext.Current.Response.Charset = "";
    HttpContext.Current.Response.ContentType = "application/vnd.ms-excel";
    StringWriter sw = new StringWriter();
    HtmlTextWriter hw = new HtmlTextWriter(sw);

    for (int i = 0; i < gv.Rows.Count; i++)
    {
        // Apply text style to each Row
        gv.Rows[i].Attributes.Add("class", "textmode");
    }
    gv.RenderControl(hw);

    HttpContext.Current.Response.Output.Write(sw.ToString());

    // commenting this out to resolve this error
    // System.Web.HttpException: The remote host closed the connection.     
    // The error code is 0x800703E3.
    // HttpContext.Current.Response.Flush();
    HttpContext.Current.Response.End();
}