手把手教你如何扩展GridView之自带Excel和Word导出

在web应用程序中,我们是不是很发愁打印问题,您是不是有过为了打印写Activex的经历,我们有没有想过,Word和Excel的打印功能能被我们利用起来呢?只要我们将我们将数据导出到Excel或者Word中,打印岂不是小case了么。下面就谈谈如何让GridView自己支持导出Excel和Word 。     首先增加了两个属性,用于指示是否支持Excel导出和Word导出  
//增加了一个设置是否显示“导出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是多页的,那也会自动将全部数据(而不是当前页的数据)导出,而且会剔除原来数据中的一些超级链接。使用起来相当简单,效果页非常好。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值