人的梦想 是不会完结的
GridView导出Excel研究
Introduction:
将GridView中的数据导出为Excel是web应用中的常见功能。在不同的应用场景下有不同的导出技术。在本文中我将介绍一些导出的技术,希望对您有所帮助
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都被截去了。如果你的ID是000345,导出后就编程了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]-->
在导出的文件中可以看见linkbutton和dropdownlist控件,虽然dropdownlist控件显示的数据的确是用户所选的项,但怎么看也不像是一个导出文件(我倒是觉的挺cool的:)译者注),现在应如何移除dropdownlist并显示选择的文字呢?
我写了一个DisableControls函数,用使循环的方法将linkbutton和dropdownlist替换成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]); } } } |
方法非常简单,只需将linkbuton和dropdownlist替换成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
评论:
你好,请参考GridView的各属性
现给出一个示例以说明我所说的意思
gv.CellPadding = 4;
gv.RowStyle.BackColor = ColorTranslator.FromHtml("#F7F6F3");
gv.RowStyle.ForeColor = ColorTranslator.FromHtml("#333333");
gv.HeaderStyle.BackColor = ColorTranslator.FromHtml("#5D7B9D");
另针对1900这个问题,我当时是在sql语句里进行格式转换的处理的,现在看来是个很失败的方法,但没找到更好的方法去解决
把
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\"");
试试,我的中文乱码问题就是这样解决的。不知道你用有没有效?
我只是简单地将数据导出。你也可以参考参考
是当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>");
//}
}
}
Regards
常用链接
我的标签
- replication(15)
- security(10)
- LOCK(6)
- log(5)
- audit(2)
- checkpoint(2)
- Configuration(2)
- tunning(2)
- 视频(2)
- UIX(1)
- 更多
随笔分类(252)
- .net 1.1(15)
- .net 2.0(12)
- AD&Exchange(2)
- Atlas(2)
- Hardware(1)
- javascript(1)
- MOSS(8)
- powershell(4)
- sql(82)
- sqlScript(17)
- WCF(11)
- WebServices(6)
- WPF(42)
- WPF Unleashed翻译(11)
- WPF/E(2)
- 翻译(27)
- 其他(1)
- 问题(4)
- 转载(4)
随笔档案(182)
- 2012年2月 (1)
- 2011年10月 (1)
- 2011年7月 (4)
- 2011年6月 (5)
- 2011年5月 (7)
- 2011年4月 (8)
- 2011年3月 (2)
- 2011年2月 (1)
- 2011年1月 (7)
- 2010年12月 (3)
- 2010年11月 (5)
- 2010年10月 (5)
- 2010年8月 (4)
- 2010年7月 (2)
- 2010年1月 (2)
- 2009年10月 (2)
- 2009年9月 (1)
- 2009年8月 (2)
- 2009年6月 (1)
- 2009年4月 (3)
- 2009年1月 (1)
- 2008年12月 (2)
- 2008年11月 (1)
- 2008年10月 (4)
- 2008年9月 (1)
- 2008年8月 (4)
- 2008年7月 (4)
- 2008年5月 (1)
- 2007年9月 (3)
- 2007年8月 (2)
- 2007年7月 (9)
- 2007年6月 (6)
- 2007年5月 (1)
- 2007年4月 (9)
- 2007年3月 (4)
- 2007年2月 (4)
- 2007年1月 (11)
- 2006年12月 (3)
- 2006年11月 (2)
- 2006年10月 (5)
- 2006年9月 (3)
- 2006年8月 (10)
- 2006年7月 (10)
- 2006年6月 (7)
- 2006年5月 (9)
相册
SQL
- DBCC Command
- Denny Cherry
- sqlserver存储相关的文章
- Example of policybasemanagment
- http://blogs.msdn.com/blakhani/
- http://blogs.msdn.com/psssql/
- http://blogs.msdn.com/sql_protocols/default.aspx
- http://blogs.msdn.com/sqlprogrammability
- http://blogs.msdn.com/sqlsecurity/
- http://sqlserver-qa.net/blogs/tools/default.aspx
- http://sqlskills.com/
- http://www.sqldba.org/
- Laurentiu
- Microsoft SQL Server Development Customer Advisory Team
- PolicyBase Management
- Raul Garcia
- SQL Server Storage Engine
- SQL Server Storage Engine
- windbi
- 索引
积分与排名
- 积分 - 198368
- 排名 - 440
最新评论
- 1. Re:对话框中的数据绑定(WPF)
- 谢谢楼主翻译。
- --爱让一切都对了
- 2. Re:Window_Open详解
- 一个页面时在一个frameset里,现在点击这个页面,要弹出另一个页面,怎么让弹出的页面替换现在页面所在的位置,就是也是显示在这个frameset里,而不是弹出一个新窗口?
大侠帮忙 - --马洪彪
- 3. Re:Window_Open详解
- 挺好的。
- --东方翔
- 4. Re:Window_Open详解
- 不错,总结的挺详细的,学习了
- --Fskjb
- 5. Re:Window_Open详解
- 不錯,很詳細,不過怎麼都不寫默認值是多少呢?
- --q14467576
阅读排行榜
- 1. Window_Open详解(38712)
- 2. GridView导出Excel研究(38573)
- 3. Request.UrlReferrer详解(9023)
- 4. Excel Services OverView系列1:什么是Excel Services(7573)
- 5. Excel Services OverView系列--2使用Excel Web Access技术在线浏览Excel工作薄(7473)
- 6. ASP.NET 2.0 - Enter Key - Default Submit Button(5891)
- 7. GridView 隐藏列问题(5343)
- 8. WPF Unleashed Chapter 2:XAML Demystified 翻译(第一部分)(4864)
- 9. Excel Services OverView系列--3使用Excel Web Services操作Excel工作薄(4810)
- 10. Pivot Table 概念介绍(4626)
- 11. XamlPad小程序(4361)
- 12. TextBlock VS Label(4117)
- 13. 请求因 HTTP 状态 401 失败:Access Denied。 (4089)
- 14. 使用iis发布wcf服务(4053)
- 15. {Binding}详释 (WPF)(3668)
- 16. WPF Unleashed Chapter 2:XAML Demystified 翻译(第二部分)(3086)
- 17. 透明加密视频演示代码(2947)
- 18. WPF Unleashed Chapter 2:XAML Demystified 翻译(第三部分)(2764)
- 19. c#发送邮件(2744)
- 20. 讨论:在建立了聚集索引的表内,数据页中的数据行是如何存储的?(2607)
评论排行榜
推荐排行榜
- 1. GridView导出Excel研究(6)
- 2. Window_Open详解(4)
- 3. 配置事物分发复制(3)
- 4. Top子句对查询计划的影响(2)
- 5. tracer token 追踪标记(1)
- 6. ASP.NET 2.0 - Enter Key - Default Submit Button(1)
- 7. Request.UrlReferrer详解(1)
- 8. 将脏页写回磁盘(1)
- 9. 翻译延期(1)
- 10. WPF Unleashed Chapter 3:Important New Concepts in WPF ---Dependency Properties(Property Value Inheritance)(1)
- 11. WPF Unleashed Chapter 3:Important New Concepts in WPF ---Dependency Properties:Change Notification(1)
- 12. WPF Unleashed Chapter 3:Important New Concepts in WPF ---Logical and Visual Trees 翻译(1)
- 13. 简体中文转换繁体中文(1)
- 14. Excel Services OverView系列--3使用Excel Web Services操作Excel工作薄(1)
- 15. Excel Services OverView系列--2使用Excel Web Access技术在线浏览Excel工作薄(1)
- 16. BitmapEffect学习(1)