GridView导出Excel研究

 
随笔-152  评论-351  文章-2  trackbacks-13

GridView导出Excel研究

Introduction:

GridView中的数据导出为Excelweb应用中的常见功能。在不同的应用场景下有不同的导出技术。在本文中我将介绍一些导出的技术,希望对您有所帮助

GridView Export the Excel (Basic Code): 

.

首先看一个基础的应用。创建一个表格,见截图

<!--[if !vml]--> <!--[if !vml]-->


<!--[endif]--> 

 

然后将数据库中的数据绑定到GridView中的数据,代码如下:

private void BindData()

{

SqlConnection myConnection = new SqlConnection("Server=localhost;Database=School;Trusted_Connection=true");

SqlDataAdapter ad = new SqlDataAdapter("SELECT * FROM Users", myConnection);

DataSet ds = new DataSet();

ad.Fill(ds);

gvUsers.DataSource = ds;

gvUsers.DataBind();

}

<!--[if !vml]-->
<!--[endif]--> <!--[if !vml]--><!--[endif]-->

现在,GridView中已经绑定了数据,接下来的任务就是导出到Excel。下面是button事件中的代码

Response.ClearContent();

Response.AddHeader("content-disposition", "attachment; filename=MyExcelFile.xls");

Response.ContentType = "application/excel";

StringWriter sw = new StringWriter();

HtmlTextWriter htw = new HtmlTextWriter(sw);

gvUsers.RenderControl(htw);

Response.Write(sw.ToString());

Response.End();

并且还需要override一下VerifyRenderingInServerForm方法(这一点非常重要,否则在点击按钮后会报错,译者注)代码如下:

public override void VerifyRenderingInServerForm(Control control)

{

}

点击导出按钮后会弹出对话框,询问您打开或保存。选择打开文件,导出到Excel的结果如下图:

<!--[if !vml]-->
<!--[endif]--> <!--[if !vml]--><!--[endif]-->

Exporting GridView to Excel With Style:

您是否注意到了以上代码存在一些的问题?是的,ID列开头的0都被截去了。如果你的ID000345,导出后就编程了345。这个问题可以通过把css添加到输出流中来解决。为了使ID列正确显示,您需要将其储存为文本格式。Excel中的文本格式表示为"mso-number-format:"\@"

protected void Btn_ExportClick(object sender, EventArgs e)

{

string style = @"<style> .text { } </script> ";

Response.ClearContent();

Response.AddHeader("content-disposition", "attachment; filename=MyExcelFile.xls");

Response.ContentType = "application/excel";

StringWriter sw = new StringWriter();

HtmlTextWriter htw = new HtmlTextWriter(sw);

gvUsers.RenderControl(htw);

// Style is added dynamically

Response.Write(style);

Response.Write(sw.ToString());

Response.End();

}

public override void VerifyRenderingInServerForm(Control control)

{

}

 在上面的代码中,我通过”style”变量来控制GridView列的样式。并通过Respnose.Write方法将其添加到输出流中。最后把样式添加到ID列。这一步需要在RowDataBound事件中完成

protected void gvUsers_RowDataBound(object sender, GridViewRowEventArgs e)

{

if (e.Row.RowType == DataControlRowType.DataRow)

{

e.Row.Cells[1].Attributes.Add("class", "text");

}

}

 修改的结果如下:

<!--[if !vml]--><!--[endif]--> <!--[if !vml]-->
<!--[endif]-->


Exporting GridView With LinkButtons and Paging: 

如果要导出的GridView中包含LinkButton或者分页(出现分页码时,译者注) 则将出现错误:

<!--[if !vml]--><!--[endif]--> <!--[if !vml]-->
<!--[endif]-->

通过修改页文件可以修正这个问题:EnableEventValidation = "false".

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

看一下导出的文件

<!--[if !vml]-->
 

在导出的文件中可以看见linkbuttondropdownlist控件,虽然dropdownlist控件显示的数据的确是用户所选的项,但怎么看也不像是一个导出文件(我倒是觉的挺cool的:)译者注),现在应如何移除dropdownlist并显示选择的文字呢?

 
我写了一个
DisableControls函数,用使循环的方法将linkbuttondropdownlist替换成literal控件

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]);

}

}

}

方法非常简单,只需将linkbutondropdownlist替换成literal控件,并将选择项赋值给literal控件的文本属性。该方法需要在导出前调用

protected void Btn_ExportExcelPaging(object sender, EventArgs e)

{

DisableControls(gvUsers);

Response.ClearContent();

Response.AddHeader("content-disposition", "attachment; filename=MyExcelFile.xls");

Response.ContentType = "application/excel";

StringWriter sw = new StringWriter();

HtmlTextWriter htw = new HtmlTextWriter(sw);

gvUsers.RenderControl(htw);

Response.Write(sw.ToString());

Response.End();

}

 

现在的Excel中就只剩下选中文本了

<!--[if !vml]-->
<!--[endif]--> <!--[if !vml]--><!--[endif]-->



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

代码下载:GridViewExportToExcelAllYouNeed.zip

分类: 翻译, .net 2.0
绿色通道: 好文要顶 谢谢关注! 收藏该文 与我联系
6
0
(请您对文章做出评价)
« 博主前一篇: ASP.NET 2.0 - Enter Key - Default Submit Button
» 博主后一篇: BitmapEffect学习
posted on 2006-08-24 20:27 stswordman 阅读(38573) 评论( 45) 编辑 收藏

评论:
#1楼 2006-08-24 20:41 | jackyrong的世界  
呵呵,本想翻译的,给楼住抢了。但我试过了,WIN2000+OFFICE 2000,导出的EXCEL文件,还是1900的格式,没有在EXCEL里显示001900哦
   回复 引用
#2楼 2006-08-24 21:06 | aspnetx  
你好,我曾在实际项目中用过此方法
但是,我不建议楼主用style来做
而是直接设置gvUsers的界面属性

另外我都是把这个这个导出逻辑封装到类里,方便多处调用,以及在以后的项目中继续使用

但文中所说的方法不失为一种解决问题的方法
多一条解决的方法就多一条设计的思路

最后支持一下
   回复 引用
#3楼 [楼主] 2006-08-24 21:23 | stswordman  
呵呵,我的环境是windowsxp+officexp,一楼的情况不清楚啊:)
to aspnetx
请问如何用设置界面属性 ?
   回复 引用
#4楼 2006-08-24 21:50 | aspnetx  
@stswordman
你好,请参考GridView的各属性
现给出一个示例以说明我所说的意思

gv.CellPadding = 4;
gv.RowStyle.BackColor = ColorTranslator.FromHtml("#F7F6F3");
gv.RowStyle.ForeColor = ColorTranslator.FromHtml("#333333");
gv.HeaderStyle.BackColor = ColorTranslator.FromHtml("#5D7B9D");

另针对1900这个问题,我当时是在sql语句里进行格式转换的处理的,现在看来是个很失败的方法,但没找到更好的方法去解决
   回复 引用
#5楼 2006-08-24 22:08 | 林子  
数据信息的导出至Excel,如果没有特殊要求,一般不建议用这种方法!
可以参考把数据集直接导出的原则,不然对于grid分页,控件等问题处理会
产生不便!

你可以参考把dataset或datatable数据集导出excel的方法!
用的是一个Excel管理类库!
我的博客上有,并且是开源的
http://linfuguo.cnblogs.com/
   回复 引用
#6楼 2006-08-24 22:39 | aspnetx  
@林子
您说的是ExcelManager吧
但是这毕竟只是针对于Excel的
有时候客户还要Word,Excel什么的,所以如果项目不大不复杂的话
还是用这种方法比较好
   回复 引用
#7楼 2006-08-25 00:50 | Dflying Chen  
@林子
是啊,Excel中存放的是数据,而Grid中只不过是数据的一种显示方法而已。从数据的这种显示格式反过来得到数据的本身,有些舍本逐末之意。
   回复 引用
#8楼 2006-08-25 10:29 | henry  
半年前做了这样一个功能的组件,通过DATASET生成操作Excel Activex的JavaScript来进行报表输出。
http://www.cnblogs.com/henryfan/archive/2006/01/22/321653.html
   回复 引用
#9楼 2006-08-25 19:37 | 高海东  
我最近也需要做导出到excel和从excle到数据到网页显示啊
   回复 引用
#10楼 2006-08-25 21:44 | 林子  
@aspnetx

呵呵,你也听说过ExcelManager啊!
其它我的主体意思是,你做的功能,项目的终极目标是什么,清楚本质是要什么!
如:导出Excel数据,终极目标是要数据,所以与就需要按照怎样得到数据,获取数据,用更好的办法去实现,个人认为这才是更好一些的解决之道!
并不是把相关功能完成就可以这么简单!

上面Dflying Chen说的很对,“舍本逐末”!
   回复 引用
#11楼 2006-09-11 14:33 | robbiezheng[未注册用户]
提供一点小补充:
如果不需要显示其中的部分列,加入一下代码即可
// turn off paging
GridView1.AllowPaging = false;
GridView1.DataBind();
GridView1.Columns[0].Visible = false;
GridView1.Columns[11].Visible = false;

GridView1.RenderControl(htw);
   回复 引用
#12楼 2006-09-26 12:48 | 天歆  
可是如果数据包含中文,则中文部分为乱码显示。请问这个问题怎么解决?
   回复 引用
#13楼 2006-10-15 17:49 | 明[匿名][未注册用户]
楼主,试了你的方法

用mso-number-format:"\@也能把内容格式成文件了,可是中文部分全变为乱码显示。请问这个问题怎么解决?
   回复 引用
#14楼 2006-10-17 17:11 | 天歆  
@明[匿名]

Response.AddHeader("content-disposition", "attachment; filename=MyExcelFile.xls");

Response.ContentType = "application/excel";

这两句改为:
Response.Write("<meta http-equiv=Content-Type content=text/html;charset=gb2312>");
Response.AppendHeader("content-disposition", "attachment;filename=\"" + System.Web.HttpUtility.UrlEncode("中文名", System.Text.Encoding.UTF8) + ".xls\"");
试试,我的中文乱码问题就是这样解决的。不知道你用有没有效?
我只是简单地将数据导出。你也可以参考参考
   回复 引用
#15楼 2006-11-01 10:43 | 猪头  
#16楼 2006-11-03 16:44 | lyj[未注册用户]
我遇到了一个情况
是当grid显示的数据较长时,导入Excel后总是有....内容显示不全,
我猜想的原因是我是把grid传进来的,而grid的格式就已经给限定住了,所以有问题
请问有什么解决方法

我的代码如下:
// To Excel
protected void btnGenerate_Click(object sender, EventArgs e)
{
this.gvForPrint.Visible = true;
ExportToExcelMgt.ExportToExcel(Response, gvForPrint);
this.gvForPrint.Visible = false;
}


public class ExportToExcelMgt
{
public static void ExportToExcel(HttpResponse response, GridView gv)
{
//try
//{
string style = @"<style> .text { } </script> ";
response.ClearContent();
response.AddHeader("content-disposition", "attachment; filename=MyExcelFile.xls");
response.ContentType = "application/ms-excel";
response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");
//response.Write("<meta http-equiv=Content-Type content=text/html;charset=gb2312>");
//response.AppendHeader("content-disposition", "attachment;filename=\"" + System.Web.HttpUtility.UrlEncode("中文名", System.Text.Encoding.UTF8) + ".xls\"");

StringWriter sw = new StringWriter();
HtmlTextWriter htw = new HtmlTextWriter(sw);
gv.RenderControl(htw);

// Style is added dynamically
response.Write(style);
response.Write(sw.ToString());
response.End();
//}
//catch
//{
// response.Write("<script langua=javascript>alert('导出Excel出错,请检查是否在没有数据情况下导出')</script>");
//}
}

}
   回复 引用
#17楼 2006-11-03 19:54 | lyj[未注册用户]
我尝试过传ds进去,但没有成功
即使能成功,但是显示在界面上的是gridview也会有...问题
   回复 引用
#18楼 2006-12-23 15:38 | javasion[未注册用户]
你所给出的方法,在用户控件页面里没有办法进行导出,因为
public override void VerifyRenderingInServerForm(Control control)
{

}
没有办法编译过去。
我想很多也没有找到个
   回复 引用
#19楼 2007-01-26 11:18 | c.life  
#20楼 2007-02-27 15:08 | 大剑师  
@javasion
是Page的方法,而不是控件的
   回复 引用
#21楼 2007-03-27 17:58 | snake[未注册用户]
如果有以下要求怎么实现??


比如我要把数据导出到Word文件,单是我单数据不是一个GridView,而是16个Lable对象 + 3个DataTable对象 + 4个GirdView对象。

先在word中导出Lable对象的Text值,然后再换行2次,再显示3个DataTable,每个DataTable也是显示一个就根2根换行,然后再是4个GridView对象,每个GridView对象显示完毕,也要换行。

这些数据都是导出到一个Word文件。


snake_xp@163.com
   回复 引用
#22楼 2007-04-27 15:37 | yunhuasheng  
@robbiezheng
很有用。
   回复 引用
#23楼 2007-04-27 15:58 | yunhuasheng  
@javasion
这个方法是空的也可以运行的
   回复 引用
#24楼 2007-06-09 03:20 | 晓风残月  
一直没弄明白DataGrid/GridView怎么导出到Excel?DataGrid 只是我们显示数据的一中方式,服务器端数据还是在数据源(如DataTable)而呈现到了客户端仅仅是一堆html table而已,现在明白老了,还是支持选择 DataTable >> Excel
   回复 引用
#25楼 2007-07-26 00:51 | 大蚂蚁[未注册用户]
引起乱码的问题就是字体,加上这两句,设置输出流为简体中文

Response.Charset = "GB2312";
Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");
   回复 引用
#26楼 2007-08-11 16:11 | TimHuang[未注册用户]
乱码问题,大蚂蚁滴是正解
   回复 引用
#27楼 2007-08-21 10:34 | zyy[未注册用户]
不错,我看了之后,解决了我中文乱码的问题,谢谢了
   回复 引用
#28楼 2007-08-22 18:38 | 凯恩  
写得不错,鼓励一下
   回复 引用
#29楼 2007-09-06 03:27 | goga[未注册用户]
收到,楼主太有才了
   回复 引用
#30楼 2008-01-16 00:43 | Ettore[未注册用户]
Try http://www.gridviewtoexcel.com/ to have real XML/XSLX exports to Excel 2003 and Excel 2007.

Regards
   回复 引用
#31楼 2008-02-25 15:42 | chen002[未注册用户]
求助下 我的gv里本身有删除的模板列在 怎么在导出的xls不显示..?
   回复 引用
#32楼 2008-06-25 17:34 | 火无极  
写得很详细,学习!~
   回复 引用
#33楼 2008-06-25 22:55 | aaaxxasdf[未注册用户]
910902583
   回复 引用
#34楼 2008-08-05 09:11 | 荔橙伊珊雨  
由于项目的需要,要求开发一个类似GOOGLE的在线EXCEL处理功能,怎么做呢?
   回复 引用
#35楼 2008-10-13 14:50 | yangjun  
你好,我看了你这篇文章,有个疑问,我一点击导出按钮,页面就关闭了,弹出保存对话框。我不想页面关闭,应该怎么做?谢谢,如果有答案,麻烦邮件给我
email: yangj@sino-manager.com
   回复 引用
#36楼 2008-12-19 10:19 | 真的很菜  
正常情况下不乱吗,但是经过筛选就会乱吗
   回复 引用
#37楼 2008-12-19 15:28 | 神魔之刻  
你好,我有个问题
用这样的方式产生的EXCEL是HTML格式的,但我要XLS的怎么办
   回复 引用
#38楼 2009-05-06 21:51 | 火~水[未注册用户]
如果GRIDVIEW中使用模板列,并对模板列进行页面编辑,然后再进行数据绑定,这样的数据绑定后能产生用户要的页面效果,那此时如何将这样显示的GRIEVIEW的效果输出到EXCEL?
   回复 引用
#39楼 2009-06-11 17:39 | 王光耀[未注册用户]
请问导出后怎么显示表头上的图片啊
   回复 引用
#40楼 2009-08-05 17:18 | hdong[未注册用户]
好文章就应该 顶顶。。。。
   回复 引用
#41楼 2009-08-29 09:59 | 『☆孑然☆』  
呜呜,我得乱码问题还是没有解决。。。。。咋办啊?
   回复 引用
#42楼 2009-09-25 08:42 | golf[未注册用户]
不是原创
   回复 引用
#43楼 2009-09-29 14:44 | Golf[未注册用户]
综合楼主,大蚂蚁,robbiezheng的可以解决问题,既能导当页也可以导全部数据!
   回复 引用
#44楼 2011-12-30 11:52 | 冠吸柏汁霆疯  
public override void VerifyRenderingInServerForm(Control control)
{

}


错误 22 “SAS.Web.Control”是“命名空间”,但此处被当做“类型”来使用 D:\SAS\Web\Search3\Cradle.aspx.cs 66 58 Web

这里的Control control类型是哪个啊???
   回复 引用
 
昵称: stswordman
园龄: 6年4个月
粉丝: 32
关注: 0
<2006年8月>
303112345
6789101112
13141516171819
20212223242526
272829303112
3456789

常用链接

我的标签

随笔分类(252)

随笔档案(182)

相册

SQL

积分与排名

  • 积分 - 198368
  • 排名 - 440

最新评论

阅读排行榜

评论排行榜

推荐排行榜

Powered by: 博客园 模板提供: 沪江博客 Copyright ©2012 stswordman

转载于:https://www.cnblogs.com/qqhfeng/archive/2012/07/28/2613004.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值