将ASP.Net 2.0下的GridView导出为Excel.(转)

简介:

在本文中我们将具体介绍如何将ASP.Net 2.0下的GridView导出为Excel.

本文的焦点是Gridview导为Excel功能和它的数据绑定只出口示范功能.

本文代码可以用来导出为Excel的功能但不局限于这个部分,还可以在很多项目中使用。

 

Step 1: Setup your web page with the Gridview

这里我假定你满足:在一个页面中有个名为GridView1GridView。在GridView中我们绑定了一个名为ContactPhoneSQL数据库。接下来的代码就是如何将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-dispositionContentType以输出不同的类型。

 

 1string attachment = "attachment; filename=Contacts.xls";
 2
 3Response.ClearContent();
 4
 5Response.AddHeader("content-disposition", attachment);
 6
 7Response.ContentType = "application/ms-excel";
 8
 9StringWriter sw = new StringWriter();
10
11HtmlTextWriter htw = new HtmlTextWriter(sw);
12
13GridView1.RenderControl(htw);
14
15Response.Write(sw.ToString());
16
17Response.End(); 
18
19



如果你运行以上代码,将返回一个HttpException

'GridView1'是一个类型为'GridView'的控件,必须为其添加一个runat=server标记.

为避免这个错误,我们添加以下代码:

1public override void VerifyRenderingInServerForm(Control control)
2
3{
4
5}

6

 

Step : Convert the contents

如果GridView中有其它控件,比如CheckboxesDropdownlists,我们需要将它转换为其相关的值,以下递归就用于导出Excel前的准备工作,将各类控件转换为其相关值.

 

 1private void PrepareGridViewForExport(Control gv)
 2
 3{
 4
 5    LinkButton lb = new LinkButton();
 6
 7    Literal l = new Literal();
 8
 9    string name = String.Empty;
10
11    for (int i = 0; i < gv.Controls.Count; i++)
12
13    {
14
15        if (gv.Controls[i].GetType() == typeof(LinkButton))
16
17        {
18
19            l.Text = (gv.Controls[i] as LinkButton).Text;
20
21 gv.Controls.Remove(gv.Controls[i]);
22
23 gv.Controls.AddAt(i, l);
24
25        }

26
27        else if (gv.Controls[i].GetType() == typeof(DropDownList))
28
29        {
30
31            l.Text = (gv.Controls[i] as DropDownList).SelectedItem.Text;
32
33            gv.Controls.Remove(gv.Controls[i]);
34
35            gv.Controls.AddAt(i, l);
36
37        }

38
39        else if (gv.Controls[i].GetType() == typeof(CheckBox))
40
41        {
42
43            l.Text = (gv.Controls[i] as CheckBox).Checked? "True" : "False";
44
45            gv.Controls.Remove(gv.Controls[i]);
46
47            gv.Controls.AddAt(i, l);
48
49        }

50
51        if (gv.Controls[i].HasControls())
52
53        {
54
55            PrepareGridViewForExport(gv.Controls[i]);
56
57        }

58
59}

60
61

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
 25Contacts 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
 33DataSourceID="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    &nbsp;
 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
 75DeleteCommand="DELETE FROM [ContactPhone] WHERE [ContactID] = @ContactID" InsertCommand="INSERT INTO [ContactPhone] ([FName], [LName], [ContactPhone]) VALUES (@FName, @LName, @ContactPhone)"
 76
 77ProviderName="<%$ ConnectionStrings:ContactsConnectionString1.ProviderName %>"
 78
 79SelectCommand="SELECT [ContactID], [FName], [LName], [ContactPhone] FROM [ContactPhone]"
 80
 81UpdateCommand="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&nbsp;
114
115<br />
116
117</div>
118
119</form>
120
121</body>
122
123</html>
124
125




ExcelExport.aspx.cs 


  1using System;
  2
  3using System.Data;
  4
  5using System.Configuration;
  6
  7using System.Collections;
  8
  9using System.Web;
 10
 11using System.Web.Security;
 12
 13using System.Web.UI;
 14
 15using System.Web.UI.WebControls;
 16
 17using System.Web.UI.WebControls.WebParts;
 18
 19using System.Web.UI.HtmlControls;
 20
 21using System.Text;
 22
 23using System.IO;
 24
 25 
 26
 27public 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实现)

 

 1private void ExportGridView()
 2
 3{
 4
 5      string attachment = "attachment; filename=Contacts.xls";
 6
 7      Response.ClearContent();
 8
 9      Response.AddHeader("content-disposition", attachment);
10
11      Response.ContentType = "application/ms-excel";
12
13      StringWriter sw = new StringWriter();
14
15      HtmlTextWriter htw = new HtmlTextWriter(sw);
16
17 
18
19      // Create a form to contain the grid
20
21      HtmlForm frm = new HtmlForm();
22
23      GridView1.Parent.Controls.Add(frm);
24
25      frm.Attributes["runat"= "server";
26
27      frm.Controls.Add(GridView1);
28
29 
30
31      frm.RenderControl(htw);
32
33      //GridView1.RenderControl(htw);
34
35      Response.Write(sw.ToString());
36
37      Response.End();
38
39}

40
41

 

这样实施有个优势,就是可将其设置为复用代码类库,不用每次去复写基类的方法.

 

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://www.cnblogs.com/skyblue/p/774289.html