手把手教你如何扩展GridView之自带Excel和Word导出
2008-06-18 14:23
726 查看
在web应用程序中,我们是不是很发愁打印问题,您是不是有过为了打印写Activex的经历,我们有没有想过,Word和Excel的打印功能能被我们利用起来呢?只要我们将我们将数据导出到Excel或者Word中,打印岂不是小case了么。下面就谈谈如何让GridView自己支持导出Excel和Word 。 首先增加了两个属性,用于指示是否支持Excel导出和Word导出
声明两个LinkButton控件btnExportWord,btnExport,分别用于点击导出Excel和点击导出word,并在控件的OnInit事件中初始化两个控件
将两个LinkButton添加到GridView子控件中。
在导出的时候,我们希望一些列不被导出,如修改,删除这样的列,因此我们添加了这样的一个属性
在导出的时候,原来的GridView列表中会有一些LinkButton或者DropDownList控件,导出的时候,我们也希望将其换成纯文本,用下面这个函数可以完成这个目的
下面是处理ItemCommand,将GridView导出的代码
使用的时候,只要指定ShowExportExcel=True,ShowExportWord=True就自动出现导出Word和导出Excel的按钮了,点击自动会将GridView中的数据导出到Word或者Excel中了,如果原GridView是多页的,那也会自动将全部数据(而不是当前页的数据)导出,而且会剔除原来数据中的一些超级链接。使用起来相当简单,效果页非常好。
//增加了一个设置是否显示“导出Word”按钮的属性 /**//// <summary> /// 排序提示信息 /// </summary> [ Description("显示导出到Word"), Category("扩展"), DefaultValue(true) ] public virtual bool ShowExportWord { get { object obj2 = this.ViewState["ShowExportWord"]; if (obj2 != null) { return (bool)obj2; } return true; } set { bool aShowExportWord = this.ShowExportWord; if (value != aShowExportWord) { this.ViewState["ShowExportWord"] = value; if (base.Initialized) { base.RequiresDataBinding = true; } } } } //增加了一个设置是否显示“导出Excel”按钮的属性 [ Description("显示导出到Excel"), Category("扩展"), DefaultValue(true) ] public virtual bool ShowExportExcel { get { object obj2 = this.ViewState["ShowExportExcel"]; if (obj2 != null) { return (bool)obj2; } return true; } set { bool aShowExportExcel = this.ShowExportExcel; if (value != aShowExportExcel) { this.ViewState["ShowExportExcel"] = value; if (base.Initialized) { base.RequiresDataBinding = true; } } } }
声明两个LinkButton控件btnExportWord,btnExport,分别用于点击导出Excel和点击导出word,并在控件的OnInit事件中初始化两个控件
LinkButton btnExportWord; LinkButton btnExport; protected override void OnInit(EventArgs e) { this.EnableViewState = true; btnExport = new LinkButton(); btnExport.CommandName = "ExportToExcel"; btnExport.EnableViewState = true; btnExport.Text = "导出Excel"; btnExportWord = new LinkButton(); btnExportWord.CommandName = "ExportToWord"; btnExportWord.EnableViewState = true; btnExportWord.Text = "导出Word"; base.OnInit(e);
将两个LinkButton添加到GridView子控件中。
protected override int CreateChildControls(System.Collections.IEnumerable dataSource, bool dataBinding) { int res = base.CreateChildControls(dataSource, dataBinding); try { GridViewRow row = new GridViewRow(0, 0, DataControlRowType.Pager, DataControlRowState.Normal); TableCell cell2 = new TableCell(); cell2.HorizontalAlign = HorizontalAlign.Right; cell2.Wrap = false; if (this.ShowExportExcel == true) { l1 = new Literal(); l1.Text = " ["; cell2.Controls.Add(l1); cell2.Controls.Add(btnExport); l1 = new Literal(); l1.Text = "] "; cell2.Controls.Add(l1); } if (this.ShowExportWord == true) { l1 = new Literal(); l1.Text = " ["; cell2.Controls.Add(l1); cell2.Controls.Add(btnExportWord); l1 = new Literal(); l1.Text = "] "; cell2.Controls.Add(l1); } r.Cells.Add(cell2); this.Controls[0].Controls.AddAt(0, row); } catch { } } return res; }
在导出的时候,我们希望一些列不被导出,如修改,删除这样的列,因此我们添加了这样的一个属性
string _UnExportedColumnNames = ""; [ Description("不导出的数据列集合,将HeaderText用,隔开"), Category("扩展"), DesignerSerializationVisibility(DesignerSerializationVisibility.Content), PersistenceMode(PersistenceMode.InnerProperty) ] public string UnExportedColumnNames { get { return _UnExportedColumnNames; } set { _UnExportedColumnNames = value; } }
在导出的时候,原来的GridView列表中会有一些LinkButton或者DropDownList控件,导出的时候,我们也希望将其换成纯文本,用下面这个函数可以完成这个目的
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[i].GetType() == typeof(LinkButton)) { l.Text = (gv.Controls[i] as LinkButton).Text; gv.Controls.Remove(gv.Controls[i]); gv.Controls.AddAt(i, l); } else if (gv.Controls[i].GetType() == typeof(DropDownList)) { l.Text = (gv.Controls[i] as DropDownList).SelectedItem.Text; gv.Controls.Remove(gv.Controls[i]); gv.Controls.AddAt(i, l); } if (gv.Controls[i].HasControls()) { DisableControls(gv.Controls[i]); } } }
下面是处理ItemCommand,将GridView导出的代码
protected override void OnRowCommand(GridViewCommandEventArgs e) { base.OnRowCommand(e); if (e.CommandName == "ExportToExcel") { string[] ss = UnExportedColumnNames.Split(','); System.Collections.Generic.List<string> list = new System.Collections.Generic.List<string>(); foreach (string s in ss) { if (s != ",") { list.Add(s); } } ShowToolBar = false; this.AllowSorting = false; HttpContext.Current.Response.Clear(); HttpContext.Current.Response.AddHeader("content-disposition", "attachment;filename=" + ExcelFileName + ".xls"); HttpContext.Current.Response.Charset = "GB2312"; HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");//设置输出流为简体中文 HttpContext.Current.Response.ContentType = "application/ms-excel"; System.IO.StringWriter stringWrite = new System.IO.StringWriter(); System.Web.UI.HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite); bool showCheckAll = ShowCheckAll; this.ShowCheckAll = false; this.AllowPaging = false; OnBind(); DisableControls(this); foreach (DataControlField c in this.Columns) { if (list.Contains(c.HeaderText) && !string.IsNullOrEmpty(c.HeaderText)) { c.Visible = false; } } this.RenderControl(htmlWrite); string content = System.Text.RegularExpressions.Regex.Replace(stringWrite.ToString(), "(<a[^>]+>)|(</a>)", ""); HttpContext.Current.Response.Write(content); HttpContext.Current.Response.End(); this.AllowPaging = true; this.AllowSorting = true; ShowToolBar = true; this.ShowCheckAll = showCheckAll; OnBind(); } else if (e.CommandName == "ExportToWord") { string[] ss = UnExportedColumnNames.Split(','); System.Collections.Generic.List<string> list = new System.Collections.Generic.List<string>(); foreach (string s in ss) { if (s != ",") { list.Add(s); } } ShowToolBar = false; this.AllowSorting = false; HttpContext.Current.Response.Clear(); HttpContext.Current.Response.AddHeader("content-disposition", "attachment;filename=" + ExcelFileName + ".doc"); HttpContext.Current.Response.Charset = "GB2312"; HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");//设置输出流为简体中文 HttpContext.Current.Response.ContentType = "application/ms-word"; System.IO.StringWriter stringWrite = new System.IO.StringWriter(); System.Web.UI.HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite); bool showCheckAll = ShowCheckAll; this.ShowCheckAll = false; this.AllowPaging = false; OnBind(); DisableControls(this); foreach (DataControlField c in this.Columns) { if (list.Contains(c.HeaderText) && !string.IsNullOrEmpty(c.HeaderText)) { c.Visible = false; } } this.RenderControl(htmlWrite); string content = System.Text.RegularExpressions.Regex.Replace(stringWrite.ToString(), "(<a[^>]+>)|(</a>)", ""); HttpContext.Current.Response.Write(content); HttpContext.Current.Response.End(); this.AllowPaging = true; this.AllowSorting = true; ShowToolBar = true; ShowCheckAll = showCheckAll; OnBind(); } }
使用的时候,只要指定ShowExportExcel=True,ShowExportWord=True就自动出现导出Word和导出Excel的按钮了,点击自动会将GridView中的数据导出到Word或者Excel中了,如果原GridView是多页的,那也会自动将全部数据(而不是当前页的数据)导出,而且会剔除原来数据中的一些超级链接。使用起来相当简单,效果页非常好。
相关文章推荐
- 手把手教你如何扩展GridView之自带Excel和Word导出
- 手把手教你如何扩展GridView之自带Excel和Word导出
- 手把手教你如何扩展GridView之自带Excel和Word导出
- 手把手教你如何扩展GridView之自带Excel和Word导出
- 手把手教你如何扩展GridView之自带CheckBox
- 扩展GridView控件(8) - 导出数据源的数据为Excel、Word或Text
- gridview数据如何导出到word,excel
- 手把手教你如何扩展GridView之自带CheckBox
- 手把手教你如何扩展GridView之自带分页
- 扩展GridView控件(8) - 导出数据源的数据为Excel、Word或Text
- 扩展GridView控件(8) - 导出数据源的数据为Excel、Word或Text
- 手把手教你如何扩展GridView之自带CheckBox
- 如何将GridView控件数据导出到word和Excel
- 扩展GridView控件(8) - 导出数据源的数据为Excel、Word或Text
- 手把手教你如何扩展GridView之自带分页
- 扩展GridView控件(8) - 导出数据源的数据为Excel、Word或Text
- 用 HTML 格式导出 Excel (如GridView导出Excel)时,如何保留显示网格线
- GridView 导出Excel或Word
- GridView数据导出到Word/Excel中
- 扩展gridview的导出excel功能乱码问题的解决