2011-07-04 8 views
5

Tôi muốn covnvert dữ liệu GridView thành trang tính Excel.Làm thế nào để chuyển đổi dữ liệu GridView thành excel sheet trong asp .net với C# lang

Tôi đã viết đoạn code dưới đây, nhưng nó mang lại cho lỗi:

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(); 
} 

Lỗi:

Control 'ctl00_ContentPlaceHolder1_GridView1' of type 'GridView' must be placed inside a form tag with runat=server.

Trả lời

2

Tôi nghĩ GridView của bạn có chứa một linkbutton/Imagebutton or another type of control, và đó là lý do tại sao bạn đang nhận được một ngoại lệ khi bạn đang cố gắng xuất GridView sang Excel.

Trước khi sử dụng điều khiển, bạn cần thêm các dòng sau vào mã Trang của bạn phía sau hoặc mã BasePage phía sau.

public override void VerifyRenderingInServerForm(Control control) 
{ 
} 

Bạn có thể sử dụng mã này, như mã này được kiểm tra và làm việc một cách hoàn hảo:

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(); 
+0

nó cho thấy lỗi ở dòng này Response.AddHeader ("Content-Disposition ", tập tin đính kèm); –

+0

Lỗi là gì? –

+0

"Kiểm soát 'ctl00_ContentPlaceHolder1_GridView1' loại 'GridView' phải được đặt bên trong một thẻ biểu mẫu với runat = máy chủ" lỗi này tôi đã nhận nó. –

1

Bạn chỉ cần sao chép dưới mã.

public override void VerifyRenderingInServerForm(Control control) 
    { 

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

    } 
+0

những gì được viết bên trong chức năng đó tôi không hiểu pl z đề nghị tôi –

+0

@ lucky jain: không viết bất kỳ mã nào, chỉ cần đặt mã này trên trang .cs của bạn. Hy vọng nó sẽ giúp ích cho bạn. –

+0

cảm ơn ya tôi đã nhận nó có tôi phải viết một tuyên bố trong tiêu đề trang đó là "EnableEventValidation =" false "" –

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

Xin chào pradeep, và chào mừng bạn đến Stackoverflow. Tuy nhiên, vui lòng xem xét định dạng mã chính xác. Bạn có thể sử dụng kiểu "mã" trong trình chỉnh sửa. – Marcel

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); 
2

Bạn đã bỏ lỡ phần này:

HtmlForm _HtmlForm= new HtmlForm(); 
GridView1.Parent.Controls.Add(_HtmlForm); 
_HtmlForm.Attributes["runat"] = "server"; 
_HtmlForm.Controls.Add(GridView1); 
_HtmlForm.RenderControl(htmlWrite); 

tôi có nghĩa là bạn nên sử dụng dòng mã này:

_HtmlForm.RenderControl(htmlWrite); 

Thay vì:

GridView1.RenderControl(htmlWrite); 

Nhưng tôi nghĩ rằng nó sẽ là tốt hơn để sử dụng thành phần mã nguồn mở miễn phí này mà nhập khẩu/xuất khẩu từ/đến khác nhau định dạng Excel và Word: http://npoi.codeplex.com/