首页 > 解决方案 > 无法导出 E​​xcel

问题描述

我有 2 个可能不相关的问题。

  1. 我一直无法导出excel表

  2. 我在 Response.End() 不断收到此错误

线程被中止

对于第一个问题,我尝试通过执行以下操作来测试代码是否有效

.aspx.cs

private void BindSalesMargin()
{
    DataTable dt = new DataTable();
    objAcc.CompanyID = Convert.ToInt16(ddlCompany.SelectedValue);
    objAcc.LocID = ddlLocation.Text;
    objAcc.dtFrom = Calendar1.SelectedDate;
    objAcc.dtTo = Calendar2.SelectedDate;
    if (ddlResult.SelectedValue == "0")
    {
        objAcc.Result = "Under,Over,OK";
    }
    else
    {
        objAcc.Result = ddlResult.Text;
    }
    dt = objAcc.Sale_MarginMail();
    SalesMargin.DataSource = dt;
    SalesMargin.DataBind();
    Session["Salesdt"] = dt;

    if (((DataTable)Session["Salesdt"]).Rows.Count > 0)
    {
        grdexport.DataSource = (DataTable)Session["Salesdt"];
        grdexport.DataBind();
        string filename = "Sales_Margin.xls";
        //string excelHeader = "";
        System.IO.StringWriter tw = new System.IO.StringWriter();
        System.Web.UI.HtmlTextWriter hw = new System.Web.UI.HtmlTextWriter(tw);
        //hw.WriteLine("<b><u><font size=’3′&gt; " + excelHeader + " </font></u></b>");
        bandDiv.RenderControl(hw);
        Response.AppendHeader("Content-Disposition", "attachment; filename=" + filename + "");
        Response.ContentType = "application/vnd.ms-excel";
        Response.ContentEncoding = System.Text.Encoding.GetEncoding("UTF-8");
        Response.ContentEncoding = System.Text.Encoding.UTF8;
        Response.BinaryWrite(System.Text.Encoding.UTF8.GetPreamble());
        Response.ContentType = "application/vnd.ms-excel; charset=ISO-8859-1";
        Response.Charset = "UTF-8";
        this.EnableViewState = false;
        Response.Write(tw.ToString().Replace("NULL", ""));
        Response.Write(Response.OutputStream);
        Response.Flush();
        try
        {
            Response.End();
            //Response.Close();
            //HttpContext.Current.ApplicationInstance.CompleteRequest();
            //ApplicationInstance.CompleteRequest();
        }
        catch (Exception ex)
        {
            ScriptManager.RegisterStartupScript(this, GetType(), "", "alert(" + ex + ");", true);
        }
    }
    else
    {
        ScriptManager.RegisterStartupScript(this, GetType(), "", "alert('No data to Export for given details');", true);
    }
}

它有效。但不适用于以下代码的按钮单击事件。

.aspx

<div class="value">
    <asp:Button ID="Export" runat="server" CssClass="Btn_Export" OnClick="Export_Click" Text="Export sales Margin" />
</div>

.aspx.cs

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        BindCompany();
        //txtFrom.Text = DateTime.Now.AddMonths(-1).AddDays(1 - DateTime.Today.Day).ToString("dd-MMM-yyyy");
        txtFrom.Text = DateTime.Now.AddDays(1 - DateTime.Today.Day).ToString("dd-MMM-yyyy");
        txtTo.Text = DateTime.Now.ToString("dd-MMM-yyyy");
        Calendar2.SelectedDate = Convert.ToDateTime(txtTo.Text);
        Calendar1.SelectedDate = Convert.ToDateTime(txtFrom.Text);
        BindSalesMargin();
    }
}

private void BindSalesMargin()
    {
        DataTable dt = new DataTable();
        objAcc.CompanyID = Convert.ToInt16(ddlCompany.SelectedValue);
        objAcc.LocID = ddlLocation.Text;
        objAcc.dtFrom = Calendar1.SelectedDate;
        objAcc.dtTo = Calendar2.SelectedDate;
        if (ddlResult.SelectedValue == "0")
        {
            objAcc.Result = "Under,Over,OK";
        }
        else
        {
            objAcc.Result = ddlResult.Text;
        }
        dt = objAcc.Sale_MarginMail();
        SalesMargin.DataSource = dt;
        SalesMargin.DataBind();
        Session["Salesdt"] = dt;
    }

protected void Export_Click(object sender, EventArgs e)
{
    if (((DataTable)Session["Salesdt"]).Rows.Count > 0)
    {
        grdexport.DataSource = (DataTable)Session["Salesdt"];
        grdexport.DataBind();
        string filename = "Sales_Margin.xls";
        //string excelHeader = "";
        System.IO.StringWriter tw = new System.IO.StringWriter();
        System.Web.UI.HtmlTextWriter hw = new System.Web.UI.HtmlTextWriter(tw);
        //hw.WriteLine("<b><u><font size=’3′&gt; " + excelHeader + " </font></u></b>");
        bandDiv.RenderControl(hw);
        Response.AppendHeader("Content-Disposition", "attachment; filename=" + filename + "");
        Response.ContentType = "application/vnd.ms-excel";
        Response.ContentEncoding = System.Text.Encoding.GetEncoding("UTF-8");
        Response.ContentEncoding = System.Text.Encoding.UTF8;
        Response.BinaryWrite(System.Text.Encoding.UTF8.GetPreamble());
        Response.ContentType = "application/vnd.ms-excel; charset=ISO-8859-1";
        Response.Charset = "UTF-8";
        this.EnableViewState = false;
        Response.Write(tw.ToString().Replace("NULL", ""));
        Response.Write(Response.OutputStream);
        Response.Flush();
        try
        {
            Response.End();
            //Response.Close();
            //HttpContext.Current.ApplicationInstance.CompleteRequest();
            //ApplicationInstance.CompleteRequest();
        }
        catch (Exception ex)
        {
            ScriptManager.RegisterStartupScript(this, GetType(), "", "alert("+ ex +");", true);
        }
    }
    else
    {
        ScriptManager.RegisterStartupScript(this, GetType(), "", "alert('No data to Export for given details');", true);
    }
}

所以我的问题是为什么它不起作用?为什么它在我必须导出到 excel 的其他类似模块中工作?我该如何解决这个问题?

标签: c#.netexport-to-excel

解决方案


推荐阅读