将GridView的内容导出到Excel中

    原文来自:http://gridviewguy.com/ArticleDetails.aspx?articleID=197

介绍:

    将GridView的内容导出到Excel是很普通的应用,在很多网站上都有使用。有各种不同的技术来实现GridView导出到Excel中,主要是看应用程序的具体情况。在本文中我将演示一些你会觉得有用的技巧。

从GridView导出到Excel(基础代码)

    让我们从基础的导出方法开始。首先,我们需要用一些数据填充GridView。我创建了一个自定义的数据表,它包含了多个字段。你可以在下面的截图中看到。

001.JPG

    现在,下一步的任务是使用数据库中的数据来填充GridView。试一试下面的代码,它使用DataSet来填充GridView。

 1 None.gif private   void  BindData()
 2 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
 3InBlock.gif
 4InBlock.gifSqlConnection myConnection = new SqlConnection("Server=localhost;Database=School;Trusted_Connection=true");
 5InBlock.gif
 6InBlock.gifSqlDataAdapter ad = new SqlDataAdapter("SELECT * FROM Users", myConnection);
 7InBlock.gif
 8InBlock.gifDataSet ds = new DataSet();
 9InBlock.gif
10InBlock.gifad.Fill(ds);
11InBlock.gif
12InBlock.gifgvUsers.DataSource = ds;
13InBlock.gif
14InBlock.gifgvUsers.DataBind(); 
15InBlock.gif
16ExpandedBlockEnd.gif}

17 None.gif
18 None.gif

002.JPG

    所以GridView现在已经填充了数据。接下去的任务就是将GridView导出到Excel。你可以在button的click事件中使用下面的代码。

 1 None.gif Response.ClearContent();
 2 None.gif
 3 None.gifResponse.AddHeader( " content-disposition " " attachment; filename=MyExcelFile.xls " );
 4 None.gif
 5 None.gifResponse.ContentType  =   " application/excel " ;
 6 None.gif
 7 None.gifStringWriter sw  =   new  StringWriter();
 8 None.gif
 9 None.gifHtmlTextWriter htw  =   new  HtmlTextWriter(sw);
10 None.gif
11 None.gifgvUsers.RenderControl(htw);
12 None.gif
13 None.gifResponse.Write(sw.ToString());
14 None.gif
15 None.gifResponse.End();
16 None.gif

    你同时还要重载VerifyRenderingInServerForm方法。参照下面的代码。

None.gif   public   override   void  VerifyRenderingInServerForm(Control control)
None.gif
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
ExpandedBlockEnd.gif}

None.gif

    当你点击Export to Excel按钮之后,将会弹出一个对话框让你选择打开或者是保存导出的文件。选择打开文件,你会看到导出的数据显示在Excel的页面中。看一看下面的截图,它显示了GridView已导出到Excel中。

 003.JPG

GridView附带样式导出到Excel中

    你有没有发现上面导出代码的问题?对了,开头的0都被截去了。这表示如果ID是000345,它会显示为345。你可以在输出的数据流中添加CSS描述来解决该问题。为了能正确的显示ID列,你要把它存储为文本。文本格式在Excel中用“mso-number-format:"\@”来表示。只要你知道了这个格式,你就可以将这个样式添加到输出的数据流中。看看下面的代码吧。

 1 None.gif protected   void  Btn_ExportClick( object  sender, EventArgs e)
 2 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
 3InBlock.gif
 4InBlock.gifstring style = @"<style> .text { mso-number-format:\@; } </script> "
 5InBlock.gif
 6InBlock.gifResponse.ClearContent();
 7InBlock.gif
 8InBlock.gifResponse.AddHeader("content-disposition""attachment; filename=MyExcelFile.xls");
 9InBlock.gif
10InBlock.gifResponse.ContentType = "application/excel";
11InBlock.gif
12InBlock.gifStringWriter sw = new StringWriter();
13InBlock.gif
14InBlock.gifHtmlTextWriter htw = new HtmlTextWriter(sw);
15InBlock.gif
16InBlock.gifgvUsers.RenderControl(htw);
17InBlock.gif
18InBlock.gif// Style is added dynamically
19InBlock.gif
20InBlock.gifResponse.Write(style); 
21InBlock.gif
22InBlock.gifResponse.Write(sw.ToString());
23InBlock.gif
24InBlock.gifResponse.End();
25InBlock.gif
26ExpandedBlockEnd.gif}

27 None.gif
28 None.gif public   override   void  VerifyRenderingInServerForm(Control control)
29 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
30InBlock.gif
31ExpandedBlockEnd.gif}

32 None.gif

    正如你在上面的代码中所看到的,我使用字符串变量“style”来存放GridView中列的样式。同时,我使用Response.Write方法来将样式写入到输出流中。最后你要做的就是将样式添加到ID列。这可以在GridView控件的RowDataBound事件中完成。

 1 None.gif protected   void  gvUsers_RowDataBound( object  sender, GridViewRowEventArgs e)
 2 ExpandedBlockStart.gifContractedBlock.gif dot.gif
 3InBlock.gif
 4InBlock.gifif (e.Row.RowType == DataControlRowType.DataRow)
 5InBlock.gif
 6ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
 7InBlock.gif
 8InBlock.gife.Row.Cells[1].Attributes.Add("class""text"); 
 9InBlock.gif
10ExpandedSubBlockEnd.gif}

11InBlock.gif
12ExpandedBlockEnd.gif}

13 None.gif


现在,当你导出GridView到Excel,该文件的内容会类似于下图。

 004.JPG

查看表格栏的样式

    你打开导出后的Excel文件就可以轻而易举的找到GridView中数据栏的正确样式。现在点击标题栏并选择“设置单元格格式”,它将显示一些参数用来格式化单元格。选择“文本”并把文件保存为.htm文件。现在,用浏览器打开这个Web文件,然后查看它的源文件。你会在样式段落发现不同的单元格所对应的样式。使用查找功能定位到ID栏。你将发现类似于下面的一行内容:

<td class=xl27 width=35 style='border-left:none;width:26pt'>ID</td>

正如你所看到上面的单元格使用样式类.x127。现在转到样式部分,找到.x127。

 1  .xl27
 2 
 3      {mso - style - parent:style0;
 4 
 5      font - weight: 700 ;
 6 
 7      mso - number - format: " \@ " ;
 8 
 9      text - align:center;
10 
11      vertical - align:middle;
12 
13      border:.5pt solid black;
14 
15      white - space:normal;}
16 
17 

当你找到.x127样式之后,你会发现单元格格式定义为:mso-number-format:"\@"

带链接按钮与分页的GridView导出到Excel:

    当你尝试导出包含带链接按钮与分页功能的GridView时,大概会看到下列错误: 

005.JPG

    你可以转到该页面的源代码中,将EnableEventValidation改为false,这样即可解决该问题。

<% @ Page Language = " C# "  EnableEventValidation = " false "  AutoEventWireup = " true "  CodeFile = " Default.aspx.cs "  Inherits = " _Default "   %>

现在,让我们来看看导出的文件:

 006.JPG

    和你看到的一样,LinkButton与DropDownList控件也和GridView一起导出了。虽然DropDownList也能正确的显示用户的选项,但是它在Excel中并不好看。所以,让我们看看如何来显示选中的文本并去除DropDownList。

    我创建了一个简单的方法:DisableControls,它遍历了GridView中的控件,并用Literal控件代替LinkButton与DropDownList控件。

 1 None.gif private   void  DisableControls(Control gv)
 2 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
 3InBlock.gif 
 4InBlock.gifLinkButton lb = new LinkButton(); 
 5InBlock.gif
 6InBlock.gifLiteral l = new Literal();
 7InBlock.gif
 8InBlock.gifstring name = String.Empty; 
 9InBlock.gif
10InBlock.giffor (int i = 0; i < gv.Controls.Count; i++)
11ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
12InBlock.gif
13InBlock.gifif (gv.Controls[i].GetType() == typeof(LinkButton))
14ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif
15InBlock.gif
16InBlock.gifl.Text = (gv.Controls[i] as LinkButton).Text; 
17InBlock.gif
18InBlock.gifgv.Controls.Remove(gv.Controls[i]); 
19InBlock.gif
20InBlock.gifgv.Controls.AddAt(i, l);
21InBlock.gif
22ExpandedSubBlockEnd.gif}

23InBlock.gifelse if (gv.Controls[i].GetType() == typeof(DropDownList))
24ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
25InBlock.gifl.Text = (gv.Controls[i] as DropDownList).SelectedItem.Text;
26InBlock.gif
27InBlock.gifgv.Controls.Remove(gv.Controls[i]); 
28InBlock.gif
29InBlock.gifgv.Controls.AddAt(i, l);
30InBlock.gif
31ExpandedSubBlockEnd.gif}
 
32InBlock.gif
33InBlock.gifif (gv.Controls[i].HasControls())
34ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
35InBlock.gif  DisableControls(gv.Controls[i]);
36ExpandedSubBlockEnd.gif}
 
37InBlock.gif
38ExpandedSubBlockEnd.gif}

39InBlock.gif
40ExpandedBlockEnd.gif}

41 None.gif
42 None.gif 
43 None.gif
44 None.gif

    这个方法很简单,用Literal控件来替换所有的LinkButton和DropDownList控件,并把它们的选择内容赋给Literal控件的Text属性。你必须在导出之前调用该方法。

 1  protected   void  Btn_ExportExcelPaging( object  sender, EventArgs e)
 2  {
 3 
 4  DisableControls(gvUsers); 
 5 
 6  Response.ClearContent();
 7 
 8  Response.AddHeader( " content-disposition " " attachment; filename=MyExcelFile.xls " );
 9 
10  Response.ContentType  =   " application/excel " ;
11 
12  StringWriter sw  =   new  StringWriter();
13 
14  HtmlTextWriter htw  =   new  HtmlTextWriter(sw);
15   
16  gvUsers.RenderControl(htw);
17 
18  Response.Write(sw.ToString());
19 
20  Response.End();
21 
22  }

最后,当你导出GridView时,只会看到选中的文本内容。看一看下面的截图所显示的效果。

 007.JPG

----------------------------------------------

翻译:Activer

Remark:  翻译的肯定不好,毕竟我的E文本来就不好,只是这两天有点无聊。甚至有些句子不能叫翻译,而是改写啦。

MSN: asp_lha@msn.com

PDF格式文件下载:Extensive_Study_of_GridView_Export_to_Excel.pdf 

转载于:https://www.cnblogs.com/Activer/archive/2006/08/27/487749.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值