如何在ASP.NET中使用C#语言将GridView数据转换为Excel表格

5

我想将GridView数据转换为Excel表格。

我已经编写了下面的代码,但是它会报错:

protected void Button1_Click(object sender, EventArgs e) 
{       
    Response.Clear();
    Response.AddHeader("content-disposition", "attachment;filename=Avukat.xls");
    Response.Charset = "";

    Response.ContentType = "application/vnd.xls";
    System.IO.StringWriter stringWrite = new System.IO.StringWriter();
    System.Web.UI.HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite);
    GridView1.RenderControl(htmlWrite);
    Response.Write("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />");
    Response.Write(stringWrite.ToString());
    Response.End();
}

错误:

控件'ctl00_ContentPlaceHolder1_GridView1'的类型为'GridView',必须放在带有runat=server属性的表单标记内。

5个回答

2
我认为您的 GridView 包含了一个 LinkButton/ImageButton 或其他类型的控件,这就是为什么在尝试将 GridView 导出到 Excel 时会出现异常的原因。
在使用控件之前,您需要在页面代码后台或 BasePage 代码后台中添加以下行。
public override void VerifyRenderingInServerForm(Control control)
{
}

你可以使用这段代码,因为它已经经过测试并且完美运行:
System.IO.StringWriter sw = new System.IO.StringWriter();
HtmlTextWriter htw = new HtmlTextWriter(sw);
Response.AddHeader("content-disposition", "attachment; filename=Avukat.xls");
Response.ClearContent();

Response.AddHeader("content-disposition", attachment);

GridView1.RenderControl(htw);
Response.Write(sw.ToString());
Response.Flush();
Response.End();

它在这一行显示错误 Response.AddHeader("content-disposition", attachment); - lucky One
我遇到了这个错误:"Control 'ctl00_ContentPlaceHolder1_GridView1' of type 'GridView' must be placed inside a form tag with runat=server"。 - lucky One
@lucky jain;我已经更新了答案,你可以尝试一下,我相信现在你的问题已经解决了。 - Muhammad Akhtar

2
您漏掉了这一部分:
HtmlForm _HtmlForm= new HtmlForm();
GridView1.Parent.Controls.Add(_HtmlForm);
_HtmlForm.Attributes["runat"] = "server";
_HtmlForm.Controls.Add(GridView1);
_HtmlForm.RenderControl(htmlWrite);

我建议您使用这行代码:

_HtmlForm.RenderControl(htmlWrite);

改为:

GridView1.RenderControl(htmlWrite); 

但我认为最好使用这个免费的开源组件,它可以导入/导出不同的Excel和Word格式:http://npoi.codeplex.com/


1
System.Web.UI.HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite);

this.gvTask.RenderBeginTag(htmlWrite);
this.gvTask.HeaderRow.RenderControl(htmlWrite);
foreach (GridViewRow row in this.gvTask.Rows)
{
    row.RenderControl(htmlWrite);
}
this.gvTask.FooterRow.RenderControl(htmlWrite);
this.gvTask.RenderEndTag(htmlWrite); 

1

你只需要复制下面的代码。

public override void VerifyRenderingInServerForm(Control control)
    {

        // Confirms that an HtmlForm control is rendered for the
        specified ASP.NET server control at run time.

    }

这个函数里面写了什么我不理解,请建议。 - lucky One
@lucky jain:不需要编写任何代码,只需将此代码放置在您的.cs页面上。希望对您有所帮助。 - Pankaj Agarwal
谢谢,我明白了。在页面头部,我需要写一个语句:“EnableEventValidation="false"”。 - lucky One

0
//**how gridview data download in excel in asp.net**

protected void btnDownload_Click(object sender, EventArgs e)
{
    CommonFunction objComm = new CommonFunction();
    Hashtable objHash = new Hashtable();
    //Hashtable htParam = new Hashtable();
    objHash.Clear();
    string str = ddlMonthlyYrs.SelectedItem.Text.ToString();
    if (str == "Select")
    {
        objHash.Add("@Cmonth", "");
    }
    else
    {
        objHash.Add("@Cmonth", str.Substring(0, 6));
    }
    if (ddlPaymentTerm.SelectedItem.Text == "Select")
    {
        objHash.Add("@PaymentTerm", "");
    }
    else
    {
        objHash.Add("@PaymentTerm", ddlPaymentTerm.SelectedValue.ToString());
    }
    if (ddlPayMode.SelectedItem.Text == "Select")
    {
        objHash.Add("@PaymentMode", "");
    }
    else
    {
        objHash.Add("@PaymentMode", ddlPayMode.SelectedValue);
    }

    objHash.Add("@PolicyNo", txtPolicyNo.Text);

    objHash.Add("@AgentCode", txtAgnCode.Text);
    objHash.Add("@AgentName", txtAgnName.Text);

    DataSet objDS = objComm.GetDataSetForPrcDBConn("Prc_GetIncBasedataRp", objHash, "Commssion");

    BasicComm.CommonFunction objCom = new BasicComm.CommonFunction();
    Response.Clear();
    //Response.Charset=”";
    Response.ContentType = "application/vnd.ms-excel";
    System.IO.StringWriter stringWrite = new System.IO.StringWriter();
    System.Web.UI.HtmlTextWriter htmlWrite = new System.Web.UI.HtmlTextWriter(stringWrite);
    System.Web.UI.WebControls.DataGrid dg = new System.Web.UI.WebControls.DataGrid();
    dg.DataSource = objDS.Tables[0];
    dg.DataBind();
    dg.RenderControl(htmlWrite);
    Response.Write(stringWrite.ToString());
    Response.End();
}

1
你好 Pradeep,欢迎来到 Stackoverflow。但请考虑正确格式化代码。您可以在编辑器中使用“code”样式。 - Marcel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接