简介:
在本文中我们将具体介绍如何将ASP.Net 2.0下的GridView导出为Excel.
本文的焦点是Gridview导为Excel功能和它的数据绑定只出口示范功能.
本文代码可以用来导出为Excel的功能但不局限于这个部分,还可以在很多项目中使用。
Step 1: Setup your web page with the Gridview
这里我假定你满足:在一个页面中有个名为GridView1的GridView。在GridView中我们绑定了一个名为ContactPhone的SQL数据库。接下来的代码就是如何将GridView导出为Excel并且不依赖于具体的数据绑定还具有场景自改变能力。
ContactPhone Table Structure:
Column Name
Type
ContactID
Int (Identity)
FName
Varchar(50)
LName
Varchar(50)
ContactPhone
Varchar(20)
Step: The Actual Export
这段代码是直接输出为Excel的,你也可以改变content-disposition和ContentType以输出不同的类型。
如果你运行以上代码,将返回一个HttpException:
‘GridView1’是一个类型为’GridView’的控件,必须为其添加一个runat=server标记.
为避免这个错误,我们添加以下代码:
Step : Convert the contents
如果GridView中有其它控件,比如Checkboxes,Dropdownlists,我们需要将它转换为其相关的值,以下递归就用于导出Excel前的准备工作,将各类控件转换为其相关值.
Code Listing:
Image: Page Design
Image : Sample in action
Image: Export to Excel button is clicked
Image: GridView contents exported to Excel
ExcelExport.aspx
1 <%@ Page Language=”C#” AutoEventWireup=”true” CodeFile=”ExportExcel.aspx.cs” Inherits=”DeleteConfirm” %> 2 3 4 5 <!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”> 6 7 8 9 <html xmlns=”http://www.w3.org/1999/xhtml” > 10 11 <head runat=”server”> 12 13 <title>Contacts Listing</title> 14 15 </head> 16 17 <body> 18 19 <form id=”form1″ runat=”server”> 20 21 <div> 22 23 <strong><span style=”font-size: small; font-family: Arial; text-decoration: underline”> 24 25 Contacts Listing 26 27 <asp:Button ID=”Button1″ runat=”server” OnClick=”Button1_Click” Text=”Export To Excel” /></span></strong><br /> 28 29 <br /> 30 31 <asp:GridView ID=”GridView1″ runat=”server” AutoGenerateColumns=”False” DataKeyNames=”ContactID” 32 33 DataSourceID=”SqlDataSource1″ EmptyDataText=”There are no data records to display.” style=”font-size: small; font-family: Arial” BackColor=”White” BorderColor=”#DEDFDE” BorderStyle=”None” BorderWidth=”1px” CellPadding=”4″ ForeColor=”Black” GridLines=”Vertical”> 34 35 <Columns> 36 37 <asp:BoundField DataField=”ContactID” HeaderText=”ContactID” ReadOnly=”True” SortExpression=”ContactID” Visible=”False” /> 38 39 <asp:BoundField DataField=”FName” HeaderText=”First Name” SortExpression=”FName” /> 40 41 <asp:BoundField DataField=”LName” HeaderText=”Last Name” SortExpression=”LName” /> 42 43 <asp:BoundField DataField=”ContactPhone” HeaderText=”Phone” SortExpression=”ContactPhone” /> 44 45 <asp:TemplateField HeaderText=”Favorites”> 46 47 <ItemTemplate> 48 49 50 51 <asp:CheckBox ID=”CheckBox1″ runat=”server” /> 52 53 </ItemTemplate></asp:TemplateField> 54 55 </Columns> 56 57 <FooterStyle BackColor=”#CCCC99″ /> 58 59 <RowStyle BackColor=”#F7F7DE” /> 60 61 <SelectedRowStyle BackColor=”#CE5D5A” Font-Bold=”True” ForeColor=”White” /> 62 63 <PagerStyle BackColor=”#F7F7DE” ForeColor=”Black” HorizontalAlign=”Right” /> 64 65 <HeaderStyle BackColor=”#6B696B” Font-Bold=”True” ForeColor=”White” /> 66 67 <AlternatingRowStyle BackColor=”White” /> 68 69 </asp:GridView> 70 71 72 73 <asp:SqlDataSource ID=”SqlDataSource1″ runat=”server” ConnectionString=”<%$ ConnectionStrings:ContactsConnectionString1 %>” 74 75 DeleteCommand=”DELETE FROM [ContactPhone] WHERE [ContactID] = @ContactID” InsertCommand=”INSERT INTO [ContactPhone] ([FName], [LName], [ContactPhone]) VALUES (@FName, @LName, @ContactPhone)” 76 77 ProviderName=”<%$ ConnectionStrings:ContactsConnectionString1.ProviderName %>” 78 79 SelectCommand=”SELECT [ContactID], [FName], [LName], [ContactPhone] FROM [ContactPhone]” 80 81 UpdateCommand=”UPDATE [ContactPhone] SET [FName] = @FName, [LName] = @LName, [ContactPhone] = @ContactPhone WHERE [ContactID] = @ContactID”> 82 83 <InsertParameters> 84 85 <asp:Parameter Name=”FName” Type=”String” /> 86 87 <asp:Parameter Name=”LName” Type=”String” /> 88 89 <asp:Parameter Name=”ContactPhone” Type=”String” /> 90 91 </InsertParameters> 92 93 <UpdateParameters> 94 95 <asp:Parameter Name=”FName” Type=”String” /> 96 97 <asp:Parameter Name=”LName” Type=”String” /> 98 99 <asp:Parameter Name=”ContactPhone” Type=”String” /> 100 101 <asp:Parameter Name=”ContactID” Type=”Int32″ /> 102 103 </UpdateParameters> 104 105 <DeleteParameters> 106 107 <asp:Parameter Name=”ContactID” Type=”Int32″ /> 108 109 </DeleteParameters> 110 111 </asp:SqlDataSource> 112 113 114 115 <br /> 116 117 </div> 118 119 </form> 120 121 </body> 122 123 </html> 124 125
ExcelExport.aspx.cs
1 using System; 2 3 using System.Data; 4 5 using System.Configuration; 6 7 using System.Collections; 8 9 using System.Web; 10 11 using System.Web.Security; 12 13 using System.Web.UI; 14 15 using System.Web.UI.WebControls; 16 17 using System.Web.UI.WebControls.WebParts; 18 19 using System.Web.UI.HtmlControls; 20 21 using System.Text; 22 23 using System.IO; 24 25 26 27 public partial class DeleteConfirm : System.Web.UI.Page 28 29{
30 31 32 33 protected void Page_Load(object sender, EventArgs e) 34 35 {
36 37 } 38 39 40 41 protected void Button1_Click(object sender, EventArgs e) 42 43 {
44 45 //Export the GridView to Excel 46 47 PrepareGridViewForExport(GridView1); 48 49 ExportGridView(); 50 51 } 52 53 54 55 private void ExportGridView() 56 57 {
58 59 string attachment = “attachment; filename=Contacts.xls”; 60 61 Response.ClearContent(); 62 63 Response.AddHeader(“content-disposition”, attachment); 64 65 Response.ContentType = “application/ms-excel”; 66 67 StringWriter sw = new StringWriter(); 68 69 HtmlTextWriter htw = new HtmlTextWriter(sw); 70 71 GridView1.RenderControl(htw); 72 73 Response.Write(sw.ToString()); 74 75 Response.End(); 76 77 } 78 79 80 81 public override void VerifyRenderingInServerForm(Control control) 82 83 {
84 85 } 86 87 88 89 private void PrepareGridViewForExport(Control gv) 90 91 {
92 93 LinkButton lb = new LinkButton(); 94 95 Literal l = new Literal(); 96 97 string name = String.Empty; 98 99 for (int i = 0; i < gv.Controls.Count; i++) 100 101 {
102 103 if (gv.Controls[i].GetType() == typeof(LinkButton)) 104 105 {
106 107 l.Text = (gv.Controls[i] as LinkButton).Text; 108 109 gv.Controls.Remove(gv.Controls[i]); 110 111 gv.Controls.AddAt(i, l); 112 113 } 114 115 else if (gv.Controls[i].GetType() == typeof(DropDownList)) 116 117 {
118 119 l.Text = (gv.Controls[i] as DropDownList).SelectedItem.Text; 120 121 gv.Controls.Remove(gv.Controls[i]); 122 123 gv.Controls.AddAt(i, l); 124 125 } 126 127 else if (gv.Controls[i].GetType() == typeof(CheckBox)) 128 129 {
130 131 l.Text = (gv.Controls[i] as CheckBox).Checked ? “True” : “False”; 132 133 gv.Controls.Remove(gv.Controls[i]); 134 135 gv.Controls.AddAt(i, l); 136 137 } 138 139 if (gv.Controls[i].HasControls()) 140 141 {
142 143 PrepareGridViewForExport(gv.Controls[i]); 144 145 } 146 147 } 148 149 } 150 151 } 152 153
Implementation Options:
通常情况,在输出函数中开发人员都会面临一个错误,典型的就是”RegisterForEventValidation can only be called during Render();”
访问者通常会在评论中提出一些好的建议.我特别要强调的是开发者需要重写VerifyRenderingInServerForm方法,该方法描述如下:
Step 1:实现导出功能的上述功能.
Step 2:重写一个VerifyRenderingInServerForm的空方法.
Step 3:修改ExportGridView函数,在绿色高亮代码部创建HtmlForm【原句为:The code highlighted in green creates and HtmlForm on the fly,在翻译HtmlForm on the fly时遇到了一些困难,故on the fly未翻译,请各位高手指教】,在导出girdview之前,添加gridview 到新的form并且render它(取代原来的render实现)
这样实施有个优势,就是可将其设置为复用代码类库,不用每次去复写基类的方法.
Note to readers:
Thank you for your comments and feedback! Happy coding!!!
ASP.Net 2.0: Export GridView to Excel – Part II
该文中将会在导出Excel 时GridView引入Hyperlink列,以至于需要使用更多的反射来重新设计原来的逻辑.
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/111092.html 原文链接:https://javaforall.net