首 页
ASP.NET
VB.NET
Visual C#
XML/XSL
Web Services
.NET FAQs
书籍出版
Silverlight 1.0 SDK 中文版
English Version
DataGrid输出到Excel并进行格式化处理
作者:孟宪会 出自:【孟宪会之精彩世界】 发布日期:2004年9月4日 11点11分20秒

在我们把DataGrid上的数据导入到Excel的时候,如果遇到比较长的数字字符串,比如身份证号码,就会在Excel里当成数字看待,并转换成科学计数法的格式,造成数据的丢失,下面这个方法就解决了这个问题,并示例如何进行其它的格式化。

查看例子

OutPutExcel.aspx

<%@ Page language="c#" Codebehind="OutPutExcel.aspx.cs" AutoEventWireup="false" Inherits="eMeng.Exam.OutPutExcel" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD> <title>OutPutExcel</title> </HEAD> <body> <form id="Form1" method="post" runat="server"> <asp:DataGrid id="DataGrid1" runat="server"></asp:DataGrid> <asp:Button id="Button1" runat="server" Text="输出到Excel"></asp:Button> </form> </body> </HTML>

OutPutExcel.aspx.cs

using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Drawing; using System.Web; using System.Web.SessionState; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; namespace eMeng.Exam { /// <summary> /// OutPutExcel 的摘要说明。 /// </summary> public class OutPutExcel : System.Web.UI.Page { protected System.Web.UI.WebControls.Button Button1; protected System.Web.UI.WebControls.DataGrid DataGrid1; private void Page_Load(object sender, System.EventArgs e) { // 在此处放置用户代码以初始化页面 DataGrid1.DataSource=CreateDataSource(); DataGrid1.DataBind(); } /// <summary> /// 创建数据源 /// </summary> /// <returns>DataView</returns> ICollection CreateDataSource() { DataTable dt = new DataTable(); DataRow dr; dt.Columns.Add(new DataColumn("身份证号码", typeof(string))); dt.Columns.Add(new DataColumn("图书单价",typeof(decimal))); dt.Columns.Add(new DataColumn("购买数量",typeof(Int32))); dt.Columns.Add(new DataColumn("总价格",typeof(decimal))); for (int i = 0; i < 30; i++) { dr = dt.NewRow(); dr[0] = "123456789123456789"; dr[1] = 100 * i /3.0; dr[2] = i + 5; dr[3] = (decimal)dr[1] * (Int32)dr[2]; dt.Rows.Add(dr); } DataView dv = new DataView(dt); return dv; } /// <summary> /// 输出到Excel /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Button1_Click(object sender, System.EventArgs e) { Response.Clear(); Response.Buffer= true; Response.Charset="GB2312"; Response.AppendHeader("Content-Disposition","attachment;filename=FileName.xls"); Response.ContentEncoding=System.Text.Encoding.GetEncoding("GB2312");//设置输出流为简体中文 Response.ContentType = "application/ms-excel";//设置输出文件类型为excel文件。 this.EnableViewState = false; System.Globalization.CultureInfo myCItrad = new System.Globalization.CultureInfo("ZH-CN",true); System.IO.StringWriter oStringWriter = new System.IO.StringWriter(myCItrad); System.Web.UI.HtmlTextWriter oHtmlTextWriter = new System.Web.UI.HtmlTextWriter(oStringWriter); this.DataGrid1.RenderControl(oHtmlTextWriter); Response.Write(oStringWriter.ToString()); Response.End(); } #region Web 窗体设计器生成的代码 override protected void OnInit(EventArgs e) { // // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。 // InitializeComponent(); base.OnInit(e); } /// <summary> /// 设计器支持所需的方法 - 不要使用代码编辑器修改 /// 此方法的内容。 /// </summary> private void InitializeComponent() { this.Button1.Click += new System.EventHandler(this.Button1_Click); this.DataGrid1.ItemDataBound += new System.Web.UI.WebControls.DataGridItemEventHandler(this.DataGrid1_ItemDataBound); this.Load += new System.EventHandler(this.Page_Load); } #endregion private void DataGrid1_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e) { if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) { e.Item.Cells[0].Attributes.Add("style","vnd.ms-excel.numberformat:@"); e.Item.Cells[3].Attributes.Add("style","vnd.ms-excel.numberformat:¥#,###.00"); } } } }
关键字:
发表评论】 【打印文章】 【收藏文章
  关于本文的评论:为了保护您的电子邮件不被骚扰,地址中的个别符号转换成了全角字符!
评论人:zz 电子邮件:asd@163.com 评论日期:2008年07月11日 07:50:21
System.Web.HttpException: 类型“DataGridLinkButton”的控件“dgtest__ctl2__ctl0”必须放在具有 runat=server 的窗体标记内。
这是为什么??

 把下面这个方法加到.aspx.cs文件中,就可以借金额了
public override void VerifyRenderingInServerForm(Control control)
    {
    }
评论人:chm 电子邮件:nian311@163.com 评论日期:2008年05月30日 04:24:05
重写这个方法public override void VerifyRenderingInServerForm(Control control) 就可以了的
评论人:李贤刚 电子邮件:lixiangang5@163.com 评论日期:2008年04月14日 05:00:17
我用您的方法试了,为什么提示错误?这是为什么?
类型“GridView”的控件“gvInfo”必须放在具有 runat=server 的窗体标记内。 

异常详细信息: System.Web.HttpException: 类型“GridView”的控件“gvInfo”必须放在具有 runat=server 的窗体标记内。

源错误: 

行 50:         this.gvInfo.RenderControl(oHtmlTextWriter);
评论人:tulips 电子邮件:wangyihong_2002@163.com 评论日期:2008年04月05日 08:06:30
我用2005试了  遇到点问题 所幸是解决了 谢谢楼主提供的实例
评论人:liyiyong1689 电子邮件:liyiyong19860330@163.com 评论日期:2008年03月28日 12:08:29
System.Web.HttpException: 类型“DataGridLinkButton”的控件“dgtest__ctl2__ctl0”必须放在具有 runat=server 的窗体标记内。
我也是这个啊。。。
评论人:牛牛牛 电子邮件:2001031529@163.com 评论日期:2007年09月21日 09:26:08
FileName.xls改成中文的文件名会出现乱码?要怎么改? 另外如何解决翻页的问题呢?谢谢。
评论人:lzqde 电子邮件:lzqde#163.com 评论日期:2007年08月30日 04:25:42
 提示错误,是因为分页?具体错误:类型“DataGridLinkButton”的控件“DataGrid1__ctl2__ctl0”必须放在具有 runat=server 的窗体标记内。
评论人:luyesql 电子邮件:linshaoqin0596@163.com 评论日期:2007年08月09日 02:57:11
FileName.xls改成中文的文件名会出现乱码?要怎么改?
评论人:wsg 电子邮件:wsg933@163.com 评论日期:2007年06月12日 05:32:19
能说详细些么?我遇到同样的问题,导出有的中文会是乱码。谢谢!~~
评论人:学习者 电子邮件:yyyyhuo@hotmail.com 评论日期:2007年06月10日 02:23:52
Response.ContentEncoding=System.Text.Encoding.GetEncoding("GB2312");
有这一句,但中文输出还是乱码啊,怎么一回事呢??
评论人:新手 电子邮件:yyyyhuo@hotmail.com 评论日期:2007年06月10日 01:16:21
System.Web.HttpException: 类型“DataGridLinkButton”的控件“dgtest__ctl2__ctl0”必须放在具有 runat=server 的窗体标记内。
我也出这个错误,不知道有没有能分页和排序又能导出的好办法啊
评论人:sx 电子邮件:sx.84@163.com 评论日期:2007年06月04日 04:53:35
忘记说了,我这些操作是在一个框架内操作的。这个有影响吗?
评论人:sx 电子邮件:sx.84@163.com 评论日期:2007年06月04日 04:52:03
Response.AppendHeader("Content-Disposition","attachment;filename=FileName.xls"); 
请问一个问题,我在点击按钮时,当前页就关闭了;不加上上面一行时既正常,只是没有了文件名称;请问加上上面一名后,为什么点击时会关闭当前页呢。
评论人:天天台 电子邮件:tianjiahe172839@126.com 评论日期:2007年05月16日 05:07:24
不走钩吗?来!加上这个就OK了,鬼知道为什么!
public override void VerifyRenderingInServerForm(Control control)
{
            // Confirms that an HtmlForm control is rendered for 
            //导出列表到Excel,如果不过载这个虚函数,就会在试图将GRIDVIEW中的数据导出至EXCEL时抛出异常:
            //类型“GridView”的控件“ctl00_content_gridView1”必须放在具有 runat=server 的窗体标记内。 
            //页面是从母版页继承的,而gridview所在的ContentPlaceHolder确定是放在form中的。以前只有控件未放在form中才会抛出同类异常。
评论人:shq 电子邮件:shqshqshqshq@163.com 评论日期:2007年04月17日 12:15:17
如果不分页导出正常 分页就显示
类型“DataGridLinkButton”的控件“dbStaffList__ctl5__ctl1”必须放在具有 runat=server 的窗体标记内。 
评论人:canserly 电子邮件:mud6805@sina.com.cn 评论日期:2007年04月03日 06:00:40
为什么我导出的文件打开时提示:无法读取文件??
评论人:wljbenson 电子邮件:wljbenson@163.com 评论日期:2007年03月22日 12:37:55
把DataGridLinkButton那列显示为false就可以了
评论人:sunshinexu 电子邮件:jingxu129@gmail.com 评论日期:2007年03月06日 11:07:23
恩,关于
/* Response.ContentEncoding=System.Text.Encoding.GetEncoding("GB2312"); */
能说详细些么?我遇到同样的问题,导出有的中文会是乱码。
评论人:shadow7896 电子邮件:shadow7896@126.com 评论日期:2007年01月02日 04:25:22
谢谢 ~~
/* Response.ContentEncoding=System.Text.Encoding.GetEncoding("GB2312"); */
一切都正常了.
评论人:shadow7896 电子邮件:shadow7896@126.com 评论日期:2007年01月02日 08:20:20
对同一个表用不同的查询语句,查询结果导出到EXCEL表中,有的一切正常、有的中文显示是乱码,是为何?
评论人:liuzn 电子邮件:liuzn@newchinalife.com 评论日期:2006年12月21日 11:05:41
如果用vb.net处理生成的excel中长数据问题,如何写?
评论人:liuzn 电子邮件:liuzn2newchinalife.com 评论日期:2006年12月21日 11:04:06
如果用vb.net如何写这部分
评论人:Benny 电子邮件:terranwinner@gmail.com 评论日期:2006年09月11日 04:40:39
分页是会出错,但是可以再做一个隐藏的datagrid,专门用来导excel嘛;或者直接从dataset导
评论人:kt0517 电子邮件:ahai517@163.com 评论日期:2006年08月29日 07:18:26
老大,要是分页的话就完了,对需要分页的无效啊
评论人:kt0517 电子邮件:ahai517@163.com 评论日期:2006年08月29日 04:47:46
DataGrid 中显示的是各条记录,要在从DataGrid导出到的EXCEL中再显示每列的总和,怎么写呢
评论人: 电子邮件: 评论日期:2006年07月28日 12:00:11
不错
评论人:devchenxip 电子邮件:hzi1980@21cn.com 评论日期:2006年06月07日 02:29:49
我用您的方法试了,为什么提示错误
System.Web.HttpException: 类型“DataGridLinkButton”的控件“dgtest__ctl2__ctl0”必须放在具有 runat=server 的窗体标记内。
这是为什么??

我是一名初学者,也碰到这样的问题。。希望楼上的高手们解答一下。。谢谢了
评论人:slily0210 电子邮件:slily0210@126.com 评论日期:2006年06月05日 10:29:53
求救,为什么我把代码写进去,结果就只是页面刷新下,没有出现叫你下载的提示框阿~~
评论人:晓月轻风 电子邮件:wljsp@163.com 评论日期:2006年05月31日 11:01:24
很好,正需要呢。
没有错误呀,可以直接运行。
评论人: 电子邮件: 评论日期:2006年04月04日 02:01:37
System.Web.HttpException: 类型“DataGridLinkButton”的控件“dgtest__ctl2__ctl0”必须放在具有 runat=server 的窗体标记内。
我也是同样这个错误,是不是datagrid里面不能加摸板列啊??
评论人: 电子邮件: 评论日期:2006年03月30日 10:11:46
服务器端需要安装OFFICE吗?
评论人:gsxiaoxiao 电子邮件:gsxiaoxiao@mail.csdn.net 评论日期:2006年02月22日 10:10:31
为什么导出到EXCEL里的都是HTML啊
评论人:tohen 电子邮件:tohen163@163.com 评论日期:2006年02月18日 09:58:55
good, 直接就可以運行, 厲害~!
评论人:chenlilinman 电子邮件:chenlilinman@163.com 评论日期:2005年03月07日 11:03:02
应该是分页和排序引起的错误,我把AllowPaghing=true;和AlowSorting=true;删掉就可以了,不知道有没有好的方法
评论人:Michael 电子邮件:hnsxb@@@@163.com 评论日期:2005年02月24日 03:10:14
而本人也碰到类似问题,其原因是我用<Div> 〔DataGrid〕 </Div> ,我用<DIV></DIV>把DataGrid围了起来。如果把DIV设置为“在服务器端运行,则网页出错,如果不设,则DataGrid中的一个按钮(为Web控件)将无法使用,页面仍旧出错。。。呜呼哀哉。。。。请大侠救命。
评论人:ddd 电子邮件:dd@ssd.com 评论日期:2004年09月06日 04:21:09
晕:
楼上的,你所有控件必须放在<FORM RUNAT=SERVER></FORM>内
评论人: 电子邮件: 评论日期:2004年09月05日 05:08:18
我用您的方法试了,为什么提示错误
System.Web.HttpException: 类型“DataGridLinkButton”的控件“dgtest__ctl2__ctl0”必须放在具有 runat=server 的窗体标记内。
这是为什么??
  发表评论(小于4000字) [注意:如果您输入电子邮件,将有利于您得到及时的回复。]【请勿发表国家法律不允许的言论,谢谢!!】
用户名: 电子邮件: 验证码:

[Valid RSS] Valid CSS!

【孟宪会之精彩世界】  ©【孟宪会之精彩世界】®孟宪会制作 2008年 版权所有 Powered By ASP.NET 2.0 特别感谢:Ahui