星辰.Net技术社区论坛

首页 » .NET » 组件/控件开发 » GridView导出Excel研究
admin - 2008-6-13 19:18:00

首先看一个基础的应用。创建一个表格,见截图


<!--[if !vml]--> <!--[if !vml]-->



<!--[endif]-->

然后将数据库中的数据绑定到GridView中的数据,代码如下:


private void BindData()


{


SqlConnection myConnection = new SqlConnection("Server=localhost;Database=School;Trusted_Connection=true");


SqlDataAdapter ad = new SqlDataAdapter("SELECT * FROM Users", myConnection);


DataSet ds = new DataSet();


ad.Fill(ds);


gvUsers.DataSource = ds;


gvUsers.DataBind();


}


<!--[if !vml]-->
<!--[endif]--> <!--[if !vml]--><!--[endif]-->



现在,GridView中已经绑定了数据,接下来的任务就是导出到Excel。下面是button事件中的代码


Response.ClearContent();


Response.AddHeader("content-disposition", "attachment; filename=MyExcelFile.xls");


Response.C;


StringWriter sw = new StringWriter();


HtmlTextWriter htw = new HtmlTextWriter(sw);


gvUsers.RenderControl(htw);


Response.Write(sw.ToString());


Response.End();



并且还需要override一下VerifyRenderingInServerForm方法(这一点非常重要,否则在点击按钮后会报错,译者注)代码如下:


public override void VerifyRenderingInServerForm(Control control)


{


}



点击导出按钮后会弹出对话框,询问您打开或保存。选择打开文件,导出到Excel的结果如下图:


<!--[if !vml]-->
<!--[endif]--> <!--[if !vml]--><!--[endif]-->


Exporting GridView to Excel With Style:


您是否注意到了以上代码存在一些的问题?是的,ID列开头的0都被截去了。如果你的ID000345,导出后就编程了345。这个问题可以通过把css添加到输出流中来解决。为了使ID列正确显示,您需要将其储存为文本格式。Excel中的文本格式表示为"mso-number-format:"\@"


protected void Btn_ExportClick(object sender, EventArgs e)


{


string style = @"<style> .text { mso-number-format:\@; } </script> ";


Response.ClearContent();


Response.AddHeader("content-disposition", "attachment; filename=MyExcelFile.xls");


Response.C;


StringWriter sw = new StringWriter();


HtmlTextWriter htw = new HtmlTextWriter(sw);


gvUsers.RenderControl(htw);


// Style is added dynamically


Response.Write(style);


Response.Write(sw.ToString());


Response.End();


}


public override void VerifyRenderingInServerForm(Control control)


{


}


在上面的代码中,我通过”style”变量来控制GridView列的样式。并通过Respnose.Write方法将其添加到输出流中。最后把样式添加到ID列。这一步需要在RowDataBound事件中完成


protected void gvUsers_RowDataBound(object sender, GridViewRowEventArgs e)


{


if (e.Row.RowType == DataControlRowType.DataRow)


{


e.Row.Cells[1].Attributes.Add("class", "text");


}


}


修改的结果如下:


<!--[if !vml]--><!--[endif]--> <!--[if !vml]-->
<!--[endif]-->



Exporting GridView With LinkButtons and Paging: 




如果要导出的GridView中包含LinkButton或者分页(出现分页码时,译者注) 则将出现错误:


<!--[if !vml]--><!--[endif]--> <!--[if !vml]-->
<!--[endif]-->


通过修改页文件可以修正这个问题:EnableEventValidation = "false".


<%@ Page Language="C#" EnableEventValidation="false" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>


看一下导出的文件


<!--[if !vml]-->


在导出的文件中可以看见linkbuttondropdownlist控件,虽然dropdownlist控件显示的数据的确是用户所选的项,但怎么看也不像是一个导出文件(我倒是觉的挺cool的:)译者注),现在应如何移除dropdownlist并显示选择的文字呢?



我写了一个
DisableControls函数,用使循环的方法将linkbuttondropdownlist替换成literal控件


private void DisableControls(Control gv)


{


LinkButton lb = new LinkButton();


Literal l = new Literal();


string name = String.Empty;


for (int i = 0; i < gv.Controls.Count; i++)


{


if (gv.Controls.GetType() == typeof(LinkButton))


{


l.Text = (gv.Controls as LinkButton).Text;


gv.Controls.Remove(gv.Controls);


gv.Controls.AddAt(i, l);


}


else if (gv.Controls.GetType() == typeof(DropDownList))


{


l.Text = (gv.Controls as DropDownList).SelectedItem.Text;


gv.Controls.Remove(gv.Controls);


gv.Controls.AddAt(i, l);


}




if (gv.Controls.HasControls())


{


DisableControls(gv.Controls);


}


}


}



方法非常简单,只需将linkbutondropdownlist替换成literal控件,并将选择项赋值给literal控件的文本属性。该方法需要在导出前调用


protected void Btn_ExportExcelPaging(object sender, EventArgs e)


{


DisableControls(gvUsers);


Response.ClearContent();


Response.AddHeader("content-disposition", "attachment; filename=MyExcelFile.xls");


Response.C;


StringWriter sw = new StringWriter();


HtmlTextWriter htw = new HtmlTextWriter(sw);


gvUsers.RenderControl(htw);


Response.Write(sw.ToString());


Response.End();


}



现在的Excel中就只剩下选中文本了


<!--[if !vml]-->
<!--[endif]--> <!--[if !vml]--><!--[endif]-->



附件: gridviewexporttoexcelallyouneed.zip
1
查看完整版本: GridView导出Excel研究