下面代碼實(shí)現(xiàn)將 GridView 導(dǎo)出到 Excel文件中。

值得注意的是VerifyRenderingInServerForm重載方法:
  MSDN上的 VerifyRenderingInServerForm 方法的描述:
  必須位于 <form runat=server> 標(biāo)記中的控件可以在呈現(xiàn)之前調(diào)用此方法,以便在控件被置于標(biāo)記外時(shí)顯示錯(cuò)誤信息。發(fā)送回或依賴于注冊(cè)的腳本塊的控件應(yīng)該在 Control.Render 方法的重寫(xiě)中調(diào)用此方法。呈現(xiàn)服務(wù)器窗體元素的方式不同的頁(yè)可以重寫(xiě)此方法以在不同的條件下引發(fā)異常。
  如果回發(fā)或使用客戶端腳本的服務(wù)器控件沒(méi)有包含在 HtmlForm 服務(wù)器控件 (<form runat="server">) 標(biāo)記中,它們將無(wú)法正常工作。這些控件可以在呈現(xiàn)時(shí)調(diào)用該方法,以在它們沒(méi)有包含在 HtmlForm 控件中時(shí)提供明確的錯(cuò)誤信息。
  開(kāi)發(fā)自定義服務(wù)器控件時(shí),通常在為任何類型的輸入標(biāo)記重寫(xiě) Render 方法時(shí)調(diào)用該方法。這在輸入控件調(diào)用 GetPostBackEventReference 或發(fā)出客戶端腳本時(shí)尤其重要。復(fù)合服務(wù)器控件不需要作出此調(diào)用。

沒(méi)有這個(gè)方法,程序?qū)?bào)錯(cuò)。

C# 代碼

<% @?Page?Language = " C# " ?EnableEventValidation = " false " ? %>

<! DOCTYPE?html?PUBLIC?"-//W3C//DTD?XHTML?1.0?Transitional//EN"
?"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
>

< script? runat ="server" >
??ICollection?CreateDataSource(?)
??
{
????System.Data.DataTable?dt?
= ? new ?System.Data.DataTable();
????System.Data.DataRow?dr;
????dt.Columns.Add(
new ?System.Data.DataColumn( " id " ,? typeof (Int32)));
????dt.Columns.Add(
new ?System.Data.DataColumn( " PkID " ,? typeof (string)));
????dt.Columns.Add(
new ?System.Data.DataColumn( " Title " ,? typeof (string)));
????
for ?( int ?i? = ? 0 ;?i? < ? 6 ;?i ++ )
????
{
??????dr?
= ?dt.NewRow();
??????dr[
0 ]? = ?i;
??????dr[
1 ]? = ? " 123456789123456789123456789 " ;
??????dr[
2 ]? = ? " <a?>歡迎光臨【孟憲會(huì)之精彩世界】</a> " ;
??????dt.Rows.Add(dr);
????}

????System.Data.DataView?dv?
= ? new ?System.Data.DataView(dt);
????
return ?dv;
??}


??protected?
void ?Page_Load(?object?sender,?EventArgs?e?)
??
{
????
if ?( ! IsPostBack)
????
{
??????GridView1.BorderWidth?
= ?Unit.Pixel( 2 );
??????GridView1.BorderColor?
= ?System.Drawing.Color.DarkOrange;
??????GridView1.DataSource?
= ?CreateDataSource();
??????GridView1.DataBind();
????}

??}


??protected?
void ?Button1_Click(?object?sender,?System.EventArgs?e?)
??
{
????Response.Clear();
????Response.Buffer?
= ? true ;
????Response.Charset?
= ? " GB2312 " ;
????Response.AppendHeader(
" Content-Disposition " ,? " attachment;filename=FileName.xls " );
????
// ?如果設(shè)置為?GetEncoding("GB2312");導(dǎo)出的文件將會(huì)出現(xiàn)亂碼!!!
????Response.ContentEncoding? = ?System.Text.Encoding.UTF7;
????Response.ContentType?
= ? " application/ms-excel " ; // 設(shè)置輸出文件類型為excel文件。?
????System.IO.StringWriter?oStringWriter? = ? new ?System.IO.StringWriter();
????System.Web.UI.HtmlTextWriter?oHtmlTextWriter?
= ? new ?System.Web.UI.HtmlTextWriter(oStringWriter);
????
this .GridView1.RenderControl(oHtmlTextWriter);
????Response.Output.Write(oStringWriter.ToString());
????Response.Flush();
????Response.End();

??}

??public?override?
void ?VerifyRenderingInServerForm(?Control?control?)
??
{?}
??protected?
void ?GridView1_RowDataBound(?object?sender,?GridViewRowEventArgs?e?)
??
{
????
if ?(e.Row.RowType? == ?DataControlRowType.DataRow)
????
{
??????e.Row.Cells[
1 ].Attributes.Add( " style " ,? " vnd.ms-excel.numberformat:@; " );
????}

??}

</ script >

< html? xmlns ="http://www.w3.org/1999/xhtml" >
< head? runat ="server" >
??
< title > 將?GridView?導(dǎo)出到?Excel?文件中 </ title >
</ head >
< body >
??
< form? id ="form1" ?runat ="server" >
????
< asp:GridView? ID ="GridView1" ?runat ="server" ?OnRowDataBound ="GridView1_RowDataBound"
??????AutoGenerateColumns
="false" >
??????
< Columns >
????????
< asp:BoundField? HeaderText ="序號(hào)" ?DataField ="id" ? />
????????
< asp:BoundField? HeaderText ="身份證號(hào)" ?DataField ="PkID" ? />
????????
< asp:BoundField? HeaderText ="網(wǎng)址" ?DataField ="Title" ?ReadOnly ="true" ?HtmlEncode ="false" ? />
??????
</ Columns >
????
</ asp:GridView >
????
< asp:Literal? ID ="HiddenOut" ?runat ="server" ? />
????
< asp:Button? ID ="Button1" ?runat ="server" ?Text ="導(dǎo)出" ?OnClick ="Button1_Click" ? />
??
</ form >
</ body >
</ html >


VB.NET 代碼

<% @?Page?Language = " VB " ? %>

<! DOCTYPE?html?PUBLIC?"-//W3C//DTD?XHTML?1.0?Transitional//EN"
?"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
>

< script? runat ="server" >
Function?CreateDataSource()?As?ICollection?
?Dim?dt?As?System.Data.DataTable?
= ?New?System.Data.DataTable?
?Dim?dr?As?System.Data.DataRow?
?dt.Columns.Add(New?System.Data.DataColumn(
" id " ,?GetType(Int32)))?
?dt.Columns.Add(New?System.Data.DataColumn(
" PkID " ,?GetType(String)))?
?dt.Columns.Add(New?System.Data.DataColumn(
" Title " ,?GetType(String)))?
?Dim?i?As?Integer?
= ? 0 ?
?While?i?
< ? 6 ?
???dr?
= ?dt.NewRow?
???dr(
0 )? = ?i?
???dr(
1 )? = ? " 123456789123456789123456789 " ?
???dr(
2 )? = ? " <a?>歡迎光臨【孟憲會(huì)之精彩世界】</a> " ?
???dt.Rows.Add(dr)?
???System.Math.Min(System.Threading.Interlocked.Increment(i),i
- 1 )?
?End?While?
?Dim?dv?As?System.Data.DataView?
= ?New?System.Data.DataView(dt)?
?Return?dv?
End?Function?

Protected?Sub?Page_Load(ByVal?sender?As?Object,?ByVal?e?As?EventArgs)?
?If?Not?IsPostBack?Then?
???GridView1.BorderWidth?
= ?Unit.Pixel( 2 )?
???GridView1.BorderColor?
= ?System.Drawing.Color.DarkOrange?
???GridView1.DataSource?
= ?CreateDataSource?
???GridView1.DataBind?
?End?If?
End?Sub?

Protected?Sub?Button1_Click(ByVal?sender?As?Object,?ByVal?e?As?System.EventArgs)?
?Response.Clear?
?Response.Buffer?
= ?True?
?Response.Charset?
= ? " GB2312 " ?
?Response.AppendHeader(
" Content-Disposition " ,? " attachment;filename=FileName.xls " )?
?Response.ContentEncoding?
= ?System.Text.Encoding.UTF7?
?Response.ContentType?
= ? " application/ms-excel " ?
?Dim?oStringWriter?As?System.IO.StringWriter?
= ?New?System.IO.StringWriter?
?Dim?oHtmlTextWriter?As?System.Web.UI.HtmlTextWriter?
= ?New?System.Web.UI.HtmlTextWriter(oStringWriter)?
?Me.GridView1.RenderControl(oHtmlTextWriter)?
?Response.Output.Write(oStringWriter.ToString)?
?Response.Flush?
?Response.End?
End?Sub?

Public?Overloads?Overrides?Sub?VerifyRenderingInServerForm(ByVal?control?As?Control)?
End?Sub?

Protected?Sub?GridView1_RowDataBound(ByVal?sender?As?Object,?ByVal?e?As?GridViewRowEventArgs)?
?If?e.Row.RowType?
= ?DataControlRowType.DataRow?Then?
???e.Row.Cells(
1 ).Attributes.Add( " style " ,? " vnd.ms-excel.numberformat:@; " )?
?End?If?
End?Sub

</ script >


< html? xmlns ="http://www.w3.org/1999/xhtml" >
< head? id ="Head1" ?runat ="server" >
??
< title > 將?GridView?導(dǎo)出到?Excel?文件中 </ title >
</ head >
< body >
??
< form? id ="form1" ?runat ="server" >
????
< asp:GridView? ID ="GridView1" ?runat ="server" ?OnRowDataBound ="GridView1_RowDataBound"
??????AutoGenerateColumns
="false" >
??????
< Columns >
????????
< asp:BoundField? HeaderText ="序號(hào)" ?DataField ="id" ? />
????????
< asp:BoundField? HeaderText ="身份證號(hào)" ?DataField ="PkID" ? />
????????
< asp:BoundField? HeaderText ="網(wǎng)址" ?DataField ="Title" ?ReadOnly ="true" ?HtmlEncode ="false" ? />
??????
</ Columns >
????
</ asp:GridView >
????
< asp:Literal? ID ="HiddenOut" ?runat ="server" ? />
????
< asp:Button? ID ="Button1" ?runat ="server" ?Text ="導(dǎo)出" ?OnClick ="Button1_Click" ? />
??
</ form >
</ body >
</ html >