GridView导出到Excel或Word文件
生活随笔
收集整理的這篇文章主要介紹了
GridView导出到Excel或Word文件
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在項目中我們經常會遇到要求將一些數據導出成Excel或者Word表格的情況,比如中國移動(我是中國移動用戶)網上查話費的頁面中就有一個導出到Excel的功能,光大網上銀行查看歷史明細也有這些功能....,原本以為這個問題不難的,不過看到網上經常有朋友問,于是我整理了一下,供大家參考。 前臺頁面:
<%@?Page?Language="C#"?AutoEventWireup="true"?CodeFile="ExportDemo.aspx.cs"?Inherits="ExportDemo"?%>?
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">?
<html?xmlns="http://www.w3.org/1999/xhtml"?>?
<head?runat="server">?
????????<title>GridView導出到Excel或Word文件——周公的博客:http://blog.csdn.net</title>?
</head>?
<body>?
????????<form?id="form1"?runat="server">?
????????<div>?
????????????????<asp:GridView?ID="gvPersonList"?runat="server"?AutoGenerateColumns="False">?
????????????????????????<Columns>?
????????????????????????????????<asp:BoundField?DataField="Id"?HeaderText="編號"?/>?
????????????????????????????????<asp:BoundField?DataField="Name"?HeaderText="姓名"?/>?
????????????????????????????????<asp:TemplateField?HeaderText="性別">?
????????????????????????????????????????<ItemTemplate>?
????????????????????????????????????????????????<%#?Eval("Sex").ToString()=="true"?"男":"女" %>?
????????????????????????????????????????</ItemTemplate>?
????????????????????????????????</asp:TemplateField>?
????????????????????????????????<asp:BoundField?DataField="Age"?HeaderText="年齡"?/>?
????????????????????????????????<asp:TemplateField?HeaderText="婚否">?
????????????????????????????????????????<ItemTemplate>?
????????????????????????????????????????????????<%#?Boolean.Parse(Eval("Married").ToString())==true?"是":"否" %>?
????????????????????????????????????????</ItemTemplate>?
????????????????????????????????</asp:TemplateField>?
????????????????????????</Columns>?
????????????????</asp:GridView>?
????????????????<asp:Button?ID="btnToExcel"?runat="server"?OnClick="btnToExcel_Click"?Text="導出到Excel"?/>?
????????????????<asp:Button?ID="btnToWord"?runat="server"?OnClick="btnToWord_Click"?Text="導出到Word"?/>?
????????</div>?
????????</form>?
</body>?
</html>
后臺代碼:
using System;?
using System.Data;?
using System.Configuration;?
using System.Collections;?
using System.Web;?
using System.Web.Security;?
using System.Web.UI;?
using System.Web.UI.WebControls;?
using System.Web.UI.WebControls.WebParts;?
using System.Web.UI.HtmlControls;?
/// <summary>?
/// 程序說明:這是一個GridView導出成Excel或者Word文件的實例。為了演示,我采用了自動生成DataTable,然后綁定。?
/// 同時為了初學者查看代碼方便,關鍵處我都做了注釋。?
/// 對程序說明,在asp.net 1.1中由于對控件呈現不是很嚴格,所以無需override void VerifyRenderingInServerForm(Control control)這個方法?
/// 但在asp.net2.0中,控件的校驗嚴格了,RenderControl代碼只有走正常流程在render方法中它自己調用才能成功,?
/// 在你自己寫的事件方法中調用就會出現這個錯誤。這個錯誤信息有點誤導,你明明寫在服務器控件Form內,它照樣會這樣提醒你,?
/// 實際上是asp.net2.0設置了內部變量控制RenderControl不允許在Render方法之外被輕易調用。如果不override VerifyRenderingInServerForm?
/// 就會報錯。我們override void VerifyRenderingInServerForm(Control control)這個方法,里面不寫任何代碼即可?
/// 作者:周公?
/// 日期:2008-5-16?
/// 網址:http://blog.csdn.net/zhoufoxcn?
/// </summary>?
public?partial?class?ExportDemo : System.Web.UI.Page?
{?
????????private?string?firstName =?"趙錢孫李周吳鄭王馮陳諸衛蔣沈韓楊朱秦尤許何呂施張孔曹嚴華";?
????????private?string?lastName =?"猛勇剛強豹彪雁燕蓉菲";?
void Page_Load() void Page_Load(object sender, EventArgs e)?
????????{?
????????????????if?(!Page.IsPostBack)?
????????????????{?
????????????????????????BindGridView();?
????????????????}?
????????}?
void BindGridView() void BindGridView()?
????????{?
????????????????DataTable myData = CreateDataTable();?
????????????????Session["MyData"] = myData;?
????????????????gvPersonList.DataSource = myData;?
????????????????gvPersonList.DataBind();?
????????}?
????????//手動生成DataTable?
DataTable CreateDataTable() DataTable CreateDataTable()?
????????{?
????????????????DataTable data =?new?DataTable();?
????????????????DataColumn dcId =?new?DataColumn("ID", typeof(Int32));?
????????????????//設置ID列自動遞增?
????????????????dcId.AutoIncrement =?true;?
????????????????//設置ID列初始值為1?
????????????????dcId.AutoIncrementSeed = 1;?
????????????????//設置ID列遞增步長為1?
????????????????dcId.AutoIncrementStep = 1;?
????????????????//將ID列添加到DataTable中?
????????????????data.Columns.Add(dcId);?
????????????????data.Columns.Add(new?DataColumn("Name", typeof(string)));?
????????????????data.Columns.Add(new?DataColumn("Age", typeof(int)));?
????????????????data.Columns.Add(new?DataColumn("Sex", typeof(bool)));?
????????????????data.Columns.Add(new?DataColumn("Married", typeof(bool)));?
????????????????DataRow dataRow =?null;?
????????????????Random random =?new?Random();?
????????????????//隨機生成20條記錄?
????????????????for?(int i = 0; i < 20; i++)?
????????????????{?
????????????????????????dataRow = data.NewRow();?
????????????????????????//隨機生成姓名?
????????????????????????dataRow["Name"] = firstName.Substring(random.Next(firstName.Length), 1) + lastName.Substring(random.Next(lastName.Length), 1);?
????????????????????????//隨即生成介于20至100之間的年齡?
????????????????????????int age = random.Next(20, 100);?
????????????????????????dataRow["Age"] = age;?
????????????????????????//隨即設置性別?
????????????????????????bool sex = (random.Next(100) % 2 == 0) ??true?:?false;?
????????????????????????dataRow["Sex"] = sex;?
????????????????????????if?(((sex ==?true) && (age >= 22)) || ((sex ==?false) && (age >= 20)))//男性結婚年齡大于22周歲,女性結婚年齡大于20周歲?
????????????????????????{?
????????????????????????????????dataRow["Married"] = (random.Next(500) % 2 == 0) ??true?:?false;?
????????????????????????}?
????????????????????????else?
????????????????????????{?
????????????????????????????????dataRow["Married"] =?false;?
????????????????????????}?
????????????????????????data.Rows.Add(dataRow);?
????????????????}?
????????????????return data;?
????????}?
????????//override掉這個方法?
override void VerifyRenderingInServerForm() override void VerifyRenderingInServerForm(Control control)?
????????{?
????????????????//注釋掉下面的代碼,否則在asp.net2.0下會報錯(注:GridView是asp.net 2.0下的控件,1.1下一些控件也可以導出成Excel或者Word)?
????????????????//base.VerifyRenderingInServerForm(control);?
????????}?
void btnToExcel_Click() void btnToExcel_Click(object sender, EventArgs e)?
????????{?
????????????????Response.Clear();?
????????????????Response.BufferOutput =?true;?
????????????????//設定輸出的字符集?
????????????????Response.Charset =?"GB2312";?
????????????????//假定導出的文件名為FileName.xls?
????????????????Response.AppendHeader("Content-Disposition",?"attachment;filename=FileName.xls");?
????????????????Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");?
????????????????//設置導出文件的格式?
????????????????Response.ContentType =?"application/ms-excel";?
????????????????//關閉ViewState?
????????????????EnableViewState =?false;?
????????????????System.Globalization.CultureInfo cultureInfo =?new?System.Globalization.CultureInfo("ZH-CN",?true);?
????????????????System.IO.StringWriter stringWriter =?new?System.IO.StringWriter(cultureInfo);?
????????????????System.Web.UI.HtmlTextWriter textWriter =?new?System.Web.UI.HtmlTextWriter(stringWriter);?
????????????????gvPersonList.RenderControl(textWriter);?
????????????????//把HTML寫回瀏覽器?
????????????????Response.Write(stringWriter.ToString());?
????????????????Response.End();?
????????}?
????????//導出成Word文件?
void btnToWord_Click() void btnToWord_Click(object sender, EventArgs e)?
????????{?
????????????????Response.Clear();?
????????????????Response.BufferOutput =?true;?
????????????????//設定輸出的字符集?
????????????????Response.Charset =?"GB2312";?
????????????????//假定導出的文件名為FileName.doc?
????????????????Response.AppendHeader("Content-Disposition",?"attachment;filename=FileName.doc");?
????????????????Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");?
????????????????設置導出文件的格式?
????????????????Response.ContentType =?"application/ms-word";?
????????????????//關閉ViewState?
????????????????gvPersonList.EnableViewState =?false;?
????????????????System.Globalization.CultureInfo cultureInfo =?new?System.Globalization.CultureInfo("ZH-CN",?true);?
????????????????System.IO.StringWriter stringWriter =?new?System.IO.StringWriter(cultureInfo);?
????????????????System.Web.UI.HtmlTextWriter textWriter =?new?System.Web.UI.HtmlTextWriter(stringWriter);?
????????????????gvPersonList.RenderControl(textWriter);?
????????????????// //把HTML寫回瀏覽器?
????????????????Response.Write(stringWriter.ToString());?
????????????????Response.End();?
????????}?
} 運行效果: 需要說明的是:在asp.net2.0環境下,VerifyRenderingInServerForm(Control control)這個方法不override的話,則會出現“錯誤提示:類型“GridView”的控件“GridView1”必須放在具有 runat=server 的窗體標記內”這個錯誤。
本文轉自周金橋51CTO博客,原文鏈接:http://blog.51cto.com/zhoufoxcn/166817?,如需轉載請自行聯系原作者
<%@?Page?Language="C#"?AutoEventWireup="true"?CodeFile="ExportDemo.aspx.cs"?Inherits="ExportDemo"?%>?
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">?
<html?xmlns="http://www.w3.org/1999/xhtml"?>?
<head?runat="server">?
????????<title>GridView導出到Excel或Word文件——周公的博客:http://blog.csdn.net</title>?
</head>?
<body>?
????????<form?id="form1"?runat="server">?
????????<div>?
????????????????<asp:GridView?ID="gvPersonList"?runat="server"?AutoGenerateColumns="False">?
????????????????????????<Columns>?
????????????????????????????????<asp:BoundField?DataField="Id"?HeaderText="編號"?/>?
????????????????????????????????<asp:BoundField?DataField="Name"?HeaderText="姓名"?/>?
????????????????????????????????<asp:TemplateField?HeaderText="性別">?
????????????????????????????????????????<ItemTemplate>?
????????????????????????????????????????????????<%#?Eval("Sex").ToString()=="true"?"男":"女" %>?
????????????????????????????????????????</ItemTemplate>?
????????????????????????????????</asp:TemplateField>?
????????????????????????????????<asp:BoundField?DataField="Age"?HeaderText="年齡"?/>?
????????????????????????????????<asp:TemplateField?HeaderText="婚否">?
????????????????????????????????????????<ItemTemplate>?
????????????????????????????????????????????????<%#?Boolean.Parse(Eval("Married").ToString())==true?"是":"否" %>?
????????????????????????????????????????</ItemTemplate>?
????????????????????????????????</asp:TemplateField>?
????????????????????????</Columns>?
????????????????</asp:GridView>?
????????????????<asp:Button?ID="btnToExcel"?runat="server"?OnClick="btnToExcel_Click"?Text="導出到Excel"?/>?
????????????????<asp:Button?ID="btnToWord"?runat="server"?OnClick="btnToWord_Click"?Text="導出到Word"?/>?
????????</div>?
????????</form>?
</body>?
</html>
后臺代碼:
using System;?
using System.Data;?
using System.Configuration;?
using System.Collections;?
using System.Web;?
using System.Web.Security;?
using System.Web.UI;?
using System.Web.UI.WebControls;?
using System.Web.UI.WebControls.WebParts;?
using System.Web.UI.HtmlControls;?
/// <summary>?
/// 程序說明:這是一個GridView導出成Excel或者Word文件的實例。為了演示,我采用了自動生成DataTable,然后綁定。?
/// 同時為了初學者查看代碼方便,關鍵處我都做了注釋。?
/// 對程序說明,在asp.net 1.1中由于對控件呈現不是很嚴格,所以無需override void VerifyRenderingInServerForm(Control control)這個方法?
/// 但在asp.net2.0中,控件的校驗嚴格了,RenderControl代碼只有走正常流程在render方法中它自己調用才能成功,?
/// 在你自己寫的事件方法中調用就會出現這個錯誤。這個錯誤信息有點誤導,你明明寫在服務器控件Form內,它照樣會這樣提醒你,?
/// 實際上是asp.net2.0設置了內部變量控制RenderControl不允許在Render方法之外被輕易調用。如果不override VerifyRenderingInServerForm?
/// 就會報錯。我們override void VerifyRenderingInServerForm(Control control)這個方法,里面不寫任何代碼即可?
/// 作者:周公?
/// 日期:2008-5-16?
/// 網址:http://blog.csdn.net/zhoufoxcn?
/// </summary>?
public?partial?class?ExportDemo : System.Web.UI.Page?
{?
????????private?string?firstName =?"趙錢孫李周吳鄭王馮陳諸衛蔣沈韓楊朱秦尤許何呂施張孔曹嚴華";?
????????private?string?lastName =?"猛勇剛強豹彪雁燕蓉菲";?
void Page_Load() void Page_Load(object sender, EventArgs e)?
????????{?
????????????????if?(!Page.IsPostBack)?
????????????????{?
????????????????????????BindGridView();?
????????????????}?
????????}?
void BindGridView() void BindGridView()?
????????{?
????????????????DataTable myData = CreateDataTable();?
????????????????Session["MyData"] = myData;?
????????????????gvPersonList.DataSource = myData;?
????????????????gvPersonList.DataBind();?
????????}?
????????//手動生成DataTable?
DataTable CreateDataTable() DataTable CreateDataTable()?
????????{?
????????????????DataTable data =?new?DataTable();?
????????????????DataColumn dcId =?new?DataColumn("ID", typeof(Int32));?
????????????????//設置ID列自動遞增?
????????????????dcId.AutoIncrement =?true;?
????????????????//設置ID列初始值為1?
????????????????dcId.AutoIncrementSeed = 1;?
????????????????//設置ID列遞增步長為1?
????????????????dcId.AutoIncrementStep = 1;?
????????????????//將ID列添加到DataTable中?
????????????????data.Columns.Add(dcId);?
????????????????data.Columns.Add(new?DataColumn("Name", typeof(string)));?
????????????????data.Columns.Add(new?DataColumn("Age", typeof(int)));?
????????????????data.Columns.Add(new?DataColumn("Sex", typeof(bool)));?
????????????????data.Columns.Add(new?DataColumn("Married", typeof(bool)));?
????????????????DataRow dataRow =?null;?
????????????????Random random =?new?Random();?
????????????????//隨機生成20條記錄?
????????????????for?(int i = 0; i < 20; i++)?
????????????????{?
????????????????????????dataRow = data.NewRow();?
????????????????????????//隨機生成姓名?
????????????????????????dataRow["Name"] = firstName.Substring(random.Next(firstName.Length), 1) + lastName.Substring(random.Next(lastName.Length), 1);?
????????????????????????//隨即生成介于20至100之間的年齡?
????????????????????????int age = random.Next(20, 100);?
????????????????????????dataRow["Age"] = age;?
????????????????????????//隨即設置性別?
????????????????????????bool sex = (random.Next(100) % 2 == 0) ??true?:?false;?
????????????????????????dataRow["Sex"] = sex;?
????????????????????????if?(((sex ==?true) && (age >= 22)) || ((sex ==?false) && (age >= 20)))//男性結婚年齡大于22周歲,女性結婚年齡大于20周歲?
????????????????????????{?
????????????????????????????????dataRow["Married"] = (random.Next(500) % 2 == 0) ??true?:?false;?
????????????????????????}?
????????????????????????else?
????????????????????????{?
????????????????????????????????dataRow["Married"] =?false;?
????????????????????????}?
????????????????????????data.Rows.Add(dataRow);?
????????????????}?
????????????????return data;?
????????}?
????????//override掉這個方法?
override void VerifyRenderingInServerForm() override void VerifyRenderingInServerForm(Control control)?
????????{?
????????????????//注釋掉下面的代碼,否則在asp.net2.0下會報錯(注:GridView是asp.net 2.0下的控件,1.1下一些控件也可以導出成Excel或者Word)?
????????????????//base.VerifyRenderingInServerForm(control);?
????????}?
void btnToExcel_Click() void btnToExcel_Click(object sender, EventArgs e)?
????????{?
????????????????Response.Clear();?
????????????????Response.BufferOutput =?true;?
????????????????//設定輸出的字符集?
????????????????Response.Charset =?"GB2312";?
????????????????//假定導出的文件名為FileName.xls?
????????????????Response.AppendHeader("Content-Disposition",?"attachment;filename=FileName.xls");?
????????????????Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");?
????????????????//設置導出文件的格式?
????????????????Response.ContentType =?"application/ms-excel";?
????????????????//關閉ViewState?
????????????????EnableViewState =?false;?
????????????????System.Globalization.CultureInfo cultureInfo =?new?System.Globalization.CultureInfo("ZH-CN",?true);?
????????????????System.IO.StringWriter stringWriter =?new?System.IO.StringWriter(cultureInfo);?
????????????????System.Web.UI.HtmlTextWriter textWriter =?new?System.Web.UI.HtmlTextWriter(stringWriter);?
????????????????gvPersonList.RenderControl(textWriter);?
????????????????//把HTML寫回瀏覽器?
????????????????Response.Write(stringWriter.ToString());?
????????????????Response.End();?
????????}?
????????//導出成Word文件?
void btnToWord_Click() void btnToWord_Click(object sender, EventArgs e)?
????????{?
????????????????Response.Clear();?
????????????????Response.BufferOutput =?true;?
????????????????//設定輸出的字符集?
????????????????Response.Charset =?"GB2312";?
????????????????//假定導出的文件名為FileName.doc?
????????????????Response.AppendHeader("Content-Disposition",?"attachment;filename=FileName.doc");?
????????????????Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");?
????????????????設置導出文件的格式?
????????????????Response.ContentType =?"application/ms-word";?
????????????????//關閉ViewState?
????????????????gvPersonList.EnableViewState =?false;?
????????????????System.Globalization.CultureInfo cultureInfo =?new?System.Globalization.CultureInfo("ZH-CN",?true);?
????????????????System.IO.StringWriter stringWriter =?new?System.IO.StringWriter(cultureInfo);?
????????????????System.Web.UI.HtmlTextWriter textWriter =?new?System.Web.UI.HtmlTextWriter(stringWriter);?
????????????????gvPersonList.RenderControl(textWriter);?
????????????????// //把HTML寫回瀏覽器?
????????????????Response.Write(stringWriter.ToString());?
????????????????Response.End();?
????????}?
} 運行效果: 需要說明的是:在asp.net2.0環境下,VerifyRenderingInServerForm(Control control)這個方法不override的話,則會出現“錯誤提示:類型“GridView”的控件“GridView1”必須放在具有 runat=server 的窗體標記內”這個錯誤。
本文轉自周金橋51CTO博客,原文鏈接:http://blog.51cto.com/zhoufoxcn/166817?,如需轉載請自行聯系原作者
總結
以上是生活随笔為你收集整理的GridView导出到Excel或Word文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java语言的替代品:JVM的新编程语言
- 下一篇: 2星|《深度模仿》:陷入锤子模式,案例太