下面代碼實現將 GridView 匯出到 Excel檔案中。
值得注意的是VerifyRenderingInServerForm重載方法:
MSDN上的 VerifyRenderingInServerForm 方法的描述:
必須位於 <form runat=server> 標記中的控制項可以在呈現之前調用此方法,以便在控制項被置於標記外時顯示錯誤資訊。發送回或依賴於註冊的指令碼塊的控制項應該在 Control.Render 方法的重寫中調用此方法。呈現伺服器表單元素的方式不同的頁可以重寫此方法以在不同的條件下引發異常。
如果回傳或使用用戶端指令碼的伺服器控制項沒有包含在 HtmlForm 伺服器控制項 (<form runat="server">) 標記中,它們將無法正常工作。這些控制項可以在呈現時調用該方法,以在它們沒有包含在 HtmlForm 控制項中時提供明確的錯誤資訊。
開發自訂伺服器控制項時,通常在為任何類型的輸入標記重寫 Render 方法時調用該方法。這在輸入控制項調用GetPostBackEventReference 或發出用戶端指令碼時尤其重要。複合伺服器控制項不需要作出此調用。
沒有這個方法,程式將報錯。
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 href='http://dotnet.aspx.cc/'>歡迎光臨【孟憲會之精彩世界】</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");
// 如果設定為 GetEncoding("GB2312");匯出的檔案將會出現亂碼!!!
Response.ContentEncoding = System.Text.Encoding.UTF7;
Response.ContentType = "application/ms-excel";//設定輸出檔案類型為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 匯出到 Excel 檔案中</title>
</head>
<body>
<form id="form1" runat="server">
<asp:GridView ID="GridView1" runat="server" OnRowDataBound="GridView1_RowDataBound"
AutoGenerateColumns="false">
<Columns>
<asp:BoundField HeaderText="序號" DataField="id" />
<asp:BoundField HeaderText="社會安全號碼" DataField="PkID" />
<asp:BoundField HeaderText="網址" DataField="Title" ReadOnly="true" HtmlEncode="false" />
</Columns>
</asp:GridView>
<asp:Literal ID="HiddenOut" runat="server" />
<asp:Button ID="Button1" runat="server" Text="匯出" OnClick="Button1_Click" />
</form>
</body>
</html>