天天看点

扩展GridView控件(8) - 导出数据源的数据为Excel、Word或Text

GridView既强大又好用。为了让它更强大、更好用,我们来写一个继承自GridView的控件。

<a href="http://webabcd.blog.51cto.com/1787395/345429" target="_blank">[索引页]</a>

<a href="http://down.51cto.com/data/101204">[源码下载]</a>

扩展GridView控件(8) - 导出数据源的数据为Excel、Word或Text

/*正式版的实现 开始*/

介绍

扩展GridView控件:

导出数据源的数据为Excel、Word或Text(应保证数据源的类型为DataTable或DataSet)

使用方法:

为SmartGridView添加的方法

Export(string fileName)

Export(string fileName, ExportFormat exportFormat)

Export(string fileName, ExportFormat exportFormat, Encoding encoding)

Export(string fileName, int[] columnIndexList, ExportFormat exportFormat, Encoding encoding)

Export(string fileName, int[] columnIndexList, string[] headers, ExportFormat exportFormat, Encoding encoding)

Export(string fileName, string[] columnNameList, ExportFormat exportFormat, Encoding encoding)

Export(string fileName, string[] columnNameList, string[] headers, ExportFormat exportFormat, Encoding encoding)

关键代码

using System; 

using System.Collections.Generic; 

using System.Text; 

using System.Data; 

using System.Web.UI.WebControls; 

namespace YYControls 

        /// &lt;summary&gt; 

        /// SmartGridView类的属性部分 

        /// &lt;/summary&gt; 

        public partial class SmartGridView 

        { 

                /// &lt;summary&gt; 

                /// 导出SmartGridView的数据源的数据 

                /// &lt;/summary&gt; 

                /// &lt;param name="fileName"&gt;文件名&lt;/param&gt; 

                /// &lt;param name="exportFormat"&gt;导出文件的格式&lt;/param&gt; 

                /// &lt;param name="encoding"&gt;编码&lt;/param&gt; 

                public void Export(string fileName, ExportFormat exportFormat, Encoding encoding) 

                { 

                        DataTable dt = GetDataTable(); 

                        Helper.Common.Export(dt, exportFormat, fileName, encoding); 

                } 

                public void Export(string fileName, ExportFormat exportFormat) 

                        Export(fileName, exportFormat, Encoding.GetEncoding("GB2312")); 

                /// 导出SmartGridView的数据源的数据为Excel 

                public void Export(string fileName) 

                        Export(fileName, ExportFormat.CSV); 

                /// &lt;param name="fileName"&gt;输出文件名&lt;/param&gt; 

                /// &lt;param name="columnIndexList"&gt;导出的列索引数组&lt;/param&gt; 

                public void Export(string fileName,int[] columnIndexList, ExportFormat exportFormat, Encoding encoding) 

                        Helper.Common.Export(dt, columnIndexList, exportFormat, fileName, encoding); 

                /// &lt;param name="columnNameList"&gt;导出的列的列名数组&lt;/param&gt; 

                public void Export(string fileName, string[] columnNameList, ExportFormat exportFormat, Encoding encoding) 

                        Helper.Common.Export(dt, columnNameList, exportFormat, fileName, encoding); 

                /// &lt;param name="headers"&gt;导出的列标题数组&lt;/param&gt; 

                public void Export(string fileName, int[] columnIndexList, string[] headers, ExportFormat exportFormat, Encoding encoding) 

                        Helper.Common.Export(dt, columnIndexList, headers, exportFormat, fileName, encoding); 

                public void Export(string fileName, string[] columnNameList, string[] headers, ExportFormat exportFormat, Encoding encoding) 

                        Helper.Common.Export(dt, columnNameList, headers, exportFormat, fileName, encoding); 

                /// 获取数据源(DataTable) 

                private DataTable GetDataTable() 

                        DataTable dt = null; 

                        if (this._dataSourceObject is DataTable) 

                                dt = (DataTable)this._dataSourceObject; 

                        else if (this._dataSourceObject is DataSet) 

                                dt = ((DataSet)this._dataSourceObject).Tables[0]; 

                        else 

                                throw new InvalidCastException("若要导出SmartGridView,应保证其数据源为DataTable或DataSet类型"); 

                        if (dt == null) 

                                throw new ArgumentNullException("数据源", "数据源不能为NULL"); 

                        return dt; 

        } 

}

/*正式版的实现 结束*/

/*测试版的实现 开始*/

把GridView导出为一个Excel文件算是一个经常要用到的功能,也比较简单,我们来扩展一个GridView以实现这样的功能。

控件开发

1、新建一个继承自GridView的类。

/// &lt;summary&gt; 

/// 继承自GridView 

/// &lt;/summary&gt; 

[ToolboxData(@"&lt;{0}:SmartGridView runat='server'&gt;&lt;/{0}:SmartGridView&gt;")] 

public class SmartGridView : GridView 

2、重写OnRowCommand,以实现把GridView导出为Excel的功能

 /// &lt;summary&gt; 

                /// OnRowCommand 

                /// &lt;param name="e"&gt;&lt;/param&gt; 

                protected override void OnRowCommand(GridViewCommandEventArgs e) 

                        if (e.CommandName.ToLower() == "exporttoexcel") 

                        { 

                                System.Web.HttpContext.Current.Response.ClearContent(); 

                                // e.CommandArgument用“;”隔开两部分,左边的部分为导出Excel的文件名称 

                                System.Web.HttpContext.Current.Response.AddHeader("content-disposition", "attachment; filename=" + e.CommandArgument.ToString().Split(';')[0] + ".xls"); 

                                System.Web.HttpContext.Current.Response.ContentType = "application/excel"; 

                                System.IO.StringWriter sw = new System.IO.StringWriter(); 

                                HtmlTextWriter htw = new HtmlTextWriter(sw); 

                                // e.CommandArgument用“;”隔开两部分,右边的部分为需要隐藏的列的索引(列索引用“,”分开) 

                                if (e.CommandArgument.ToString().Split(';').Length &gt; 1) 

                                { 

                                        foreach (string s in e.CommandArgument.ToString().Split(';')[1].Split(',')) 

                                        { 

                                                int i; 

                                                if (!Int32.TryParse(s, out i)) 

                                                { 

                                                        throw new ArgumentException("需要隐藏的列的索引不是整数");    

                                                } 

                                                if (i &gt; this.Columns.Count) 

                                                        throw new ArgumentOutOfRangeException("需要隐藏的列的索引超出范围"); 

                                                this.Columns[i].Visible = false; 

                                        } 

                                } 

                                // 隐藏“导出Excel”按钮 

                                ((Control)e.CommandSource).Visible = false; 

                                // 如果HeaderRow里的控件是button的话,则把它替换成文本 

                                foreach (TableCell tc in this.HeaderRow.Cells) 

                                        // TableCell里的每个Control 

                                        foreach (Control c in tc.Controls) 

                                                // 如果控件继承自接口IButtonControl 

                                                if (c.GetType().GetInterface("IButtonControl") != null &amp;&amp; c.GetType().GetInterface("IButtonControl").Equals(typeof(IButtonControl))) 

                                                        // 如果该控件不是“导出Excel”按钮则把button转换成文本 

                                                        if (!c.Equals(e.CommandSource)) 

                                                        { 

                                                                tc.Controls.Clear(); 

                                                                tc.Text = ((IButtonControl)c).Text; 

                                                        } 

                                // 将服务器控件的内容输出到所提供的 System.Web.UI.HtmlTextWriter 对象中 

                                this.RenderControl(htw); 

                                System.Web.HttpContext.Current.Response.Write(sw.ToString()); 

                                System.Web.HttpContext.Current.Response.End(); 

                        } 

                        base.OnRowCommand(e); 

                }

控件使用

添加这个控件到工具箱里,然后拖拽到webform上,在GridView内加一个按钮,把CommandName属性设置为“ExportToExcel”,CommandArgument属性的值用“;”做分隔符分为两部分,左边的部分为导出Excel的文件名称,右边的部分为需要隐藏的列的索引(列索引用“,”分开)

ObjData.cs

using System.Configuration; 

using System.Web; 

using System.Web.Security; 

using System.Web.UI; 

using System.Web.UI.WebControls.WebParts; 

using System.Web.UI.HtmlControls; 

using System.ComponentModel; 

/// OjbData 的摘要说明 

public class OjbData 

        public OjbData() 

                // 

                // TODO: 在此处添加构造函数逻辑 

        [DataObjectMethod(DataObjectMethodType.Select, true)] 

        public DataTable Select() 

                DataTable dt = new DataTable(); 

                dt.Columns.Add("no", typeof(string)); 

                dt.Columns.Add("name", typeof(string)); 

                for (int i = 0; i &lt; 30; i++) 

                        DataRow dr = dt.NewRow(); 

                        dr[0] = "no" + i.ToString().PadLeft(2, '0'); 

                        dr[1] = "name" + i.ToString().PadLeft(2, '0'); 

                        dt.Rows.Add(dr); 

                return dt; 

Default.aspx

&lt;%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %&gt; 

&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt; 

&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt; 

&lt;head runat="server"&gt; 

        &lt;title&gt;SmartGridView测试&lt;/title&gt; 

&lt;/head&gt; 

&lt;body&gt; 

        &lt;form id="form1" runat="server"&gt; 

                &lt;div&gt; 

                        &lt;yyc:SmartGridView ID="SmartGridView1" runat="server" AutoGenerateColumns="False" 

                                DataSourceID="ObjectDataSource1"&gt; 

                                &lt;Columns&gt; 

                                        &lt;asp:TemplateField ItemStyle-Width="50px"&gt; 

                                                &lt;headertemplate&gt; 

                                                        &lt;asp:Button id="btnExportToExcel" runat="server" Text="Excel" CommandName="ExportToExcel" CommandArgument="ExcelFileName;5,6" /&gt; 

                                                &lt;/headertemplate&gt; 

                                                &lt;itemtemplate&gt; 

                                                        &lt;%# Container.DataItemIndex + 1 %&gt; 

                                                &lt;/itemtemplate&gt; 

                                        &lt;/asp:TemplateField&gt; 

                                        &lt;asp:BoundField DataField="no" HeaderText="序号" SortExpression="no" ItemStyle-Width="100px" /&gt; 

                                        &lt;asp:BoundField DataField="name" HeaderText="名称" SortExpression="name" ItemStyle-Width="100px" /&gt; 

                                &lt;/Columns&gt; 

                        &lt;/yyc:SmartGridView&gt; 

                        &lt;asp:ObjectDataSource ID="ObjectDataSource1" runat="server" SelectMethod="Select" 

                                TypeName="OjbData"&gt;&lt;/asp:ObjectDataSource&gt; 

                &lt;/div&gt; 

        &lt;/form&gt; 

&lt;/body&gt; 

&lt;/html&gt;

注:为了防止出错要在.cs代码中加上下面这句

public override void VerifyRenderingInServerForm(Control control) 

        }

另外,如果你的GridView中含有命令按钮的话要在.aspx页面的头部中加上下面这个属性

EnableEventValidation="false"

/*测试版的实现 结束*/

OK

<a href="http://down.51cto.com/data/101204" target="_blank">[源码下载]</a>

     本文转自webabcd 51CTO博客,原文链接:http://blog.51cto.com/webabcd/345538,如需转载请自行联系原作者