DataGrid导出Excel遇到的一些问题

项目需要,最近一直在弄WEB报表方面的东西。在做的时候。根据用户需求。做了一个表格数据(DataGrid)导出到Excel。在做的时候发现了个问题。
由于数据量比较大。势必要做分页。如此这样。利用最简单的属性生成器。给DataGrid分页。然后写导出到Excel的代码。代码如下:
     private   void  ExportExcelFromDataGrid(  string  filename , System.Web.UI.WebControls.DataGrid ToExcelGrid )
        
{
            Response.Clear();
            Response.Buffer
=true;     
            Response.Charset
="utf-8";           
            Response.AppendHeader(
"Content-Disposition","attachment;filename="+Server.UrlEncode ( filename ) );     
            Response.ContentEncoding
=System.Text.Encoding.Default;//设置输出流为简体中文   
            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);   
            ToExcelGrid.RenderControl(oHtmlTextWriter);     
            Response.Write(oStringWriter.ToString());
            Response.End();
        }
然后在一个按钮事件中。调用下。代码如下
private   void  Button3_Click( object  sender, System.EventArgs e)
    
{
        
string filename = "test.xls";
        
this.ExportExcelFromDataGrid ( filename , this.DataGrid1 );
        
    }
结果程序给报错。如下:
“/Web_DVBAres_C2.2”应用程序中的服务器错误。
--------------------------------------------------------------------------------

类型“DataGridLinkButton”的控件“DataGrid1__ctl5__ctl1”必须放在具有 runat=server 的窗体标记内。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

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

源错误:


行 61:             System.IO.StringWriter   oStringWriter   =   new   System.IO.StringWriter(myCItrad);    
行 62:             System.Web.UI.HtmlTextWriter oHtmlTextWriter  =  new   System.Web.UI.HtmlTextWriter(oStringWriter);  
行 63:             ToExcelGrid.RenderControl(oHtmlTextWriter);    
行 64:             Response.Write(oStringWriter.ToString());
行 65:             Response.End();
 

源文件: c:/inetpub/wwwroot/web_dvbares_c2.2/webform3.aspx.cs    行: 63

堆栈跟踪:


[HttpException (0x80004005): 类型“DataGridLinkButton”的控件“DataGrid1__ctl5__ctl1”必须放在具有 runat=server 的窗体标记内。]
   System.Web.UI.Page.VerifyRenderingInServerForm(Control control) +152
   System.Web.UI.WebControls.LinkButton.AddAttributesToRender(HtmlTextWriter writer) +38
   System.Web.UI.WebControls.WebControl.RenderBeginTag(HtmlTextWriter writer) +17
   System.Web.UI.WebControls.DataGridLinkButton.Render(HtmlTextWriter writer) +25
   System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +243
   System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +72
   System.Web.UI.WebControls.TableCell.RenderContents(HtmlTextWriter writer) +55
   System.Web.UI.WebControls.WebControl.Render(HtmlTextWriter writer) +29
   System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +243
   System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +72
   System.Web.UI.WebControls.WebControl.RenderContents(HtmlTextWriter writer) +7
   System.Web.UI.WebControls.WebControl.Render(HtmlTextWriter writer) +29
   System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +243
   System.Web.UI.WebControls.Table.RenderContents(HtmlTextWriter writer) +99
   System.Web.UI.WebControls.WebControl.Render(HtmlTextWriter writer) +29
   System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +243
   System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +72
   System.Web.UI.WebControls.WebControl.RenderContents(HtmlTextWriter writer) +7
   System.Web.UI.WebControls.BaseDataList.Render(HtmlTextWriter writer) +27
   System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +243
   Web_DVBAres_C2._2.WebForm3.ExportExcelFromDataGrid(String filename, DataGrid ToExcelGrid) in c:/inetpub/wwwroot/web_dvbares_c2.2/webform3.aspx.cs:63
   Web_DVBAres_C2._2.WebForm3.Button3_Click(Object sender, EventArgs e) in c:/inetpub/wwwroot/web_dvbares_c2.2/webform3.aspx.cs:132
   System.Web.UI.WebControls.Button.OnClick(EventArgs e) +108
   System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +57
   System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +18
   System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +33
   System.Web.UI.Page.ProcessRequestMain() +1277
原想“DataGridLinkButton”的控件“DataGrid1__ctl5__ctl1”必须放在具有 runat=server 的窗体标记内。 既然这么提示。最BC的做法。就是“DataGrid1__ctl5__ctl1”这个“控件“加上runat=server。结果在项目一搜。压根就没发现这个控件。既然这样。没办法。只有合理利用资源。
Google下了。看了一些文章。发现是由于在DataGrid控件上。利用属性生成器。添加了分页“控件”。导致报错。去掉自带的分页功能。势必要写分页程序,而且还有可能要改动数据结构。得不偿失。没办法只好继续找办法。后面看到木野狐兄写的一个导出Excel的帮助类。直接资源利用。问题解决。附上野狐兄的代码(如果野狐兄不希望被转的话.麻烦说声.立马删*_*)

// =============================================================================== 
//  
//  从 DataGrid    或数据源中导出数据到 Excel 并提示下载的帮助类。 
//  
//  Author:    Roger Chen (木野狐) 
//  Date:    2005-1-27 
//  Version: 1.22 
//  History: 
//             v1.00    使用静态方法的形式实现该类,提供多种重载方式。 
//             v1.01    添加了对 DevExpress.Web.ASPxGrid.ASPxGrid 的直接导出支持。 
//             v1.20    改写为实体类。 减少了重复代码。 
//             v1.21    2005-2-1     
//                     修改了一个构造函数的重载形式中异常检测的代码。延迟到 Export() 方法。 
//             v1.22    2005-2-3     
//                     1. 修正了 Export() 方法中缺少 _titles != null 判断的 bug. 
//                     2. 修正了长的数字被 Excel 自动转换为科学计数法的毛病。 
//                         (修改的办法来自  http://dotnet.aspx.cc
//  
// =============================================================================== 
namespace   Web_DVBAres_C2._2

    
using System; 
    
using System.IO; 
    
using System.Data; 
    
using System.Web; 
    
using System.Web.UI; 
    
using System.Web.UI.WebControls; 
    
using System.Text; 
    
using System.Globalization; 
    
using System.Collections; 
    
//using DevExpress.Web.ASPxGrid; 
 
    
public class ExcelHelper 
    

        
Fields 
 
        
Properties 
 
        
.ctor 
         
        
public Methods 
 
        
private Methods 
    }
 
}
 
调用方法
            
//  1. 导出一个不分页的 DataGrid 到 Excel.
ExcelHelper helper  =   new  ExcelHelper();
//  设置文件名(可省。省略则自动生成一个随机的文件名)
helper.FileName  =   " xxx.xls " ;
helper.Export(dg);

//  2. 导出分页的 DataGrid,需要同时指定他的数据源(DataTable)
DataTable dt  =  ;
ExcelHelper helper 
=   new  ExcelHelper(dt);
//  最大导出条数(可省)
helper.MaxRecords  =   2000 ;
helper.Export();

//  3. 如果要指定列标题,这样调用:
DataTable dt  =  ;
ExcelHelper helper 
=   new  ExcelHelper(
    
new   string []  {"列标题1""列标题2",  }
    dt);
helper.Export();

//  4. 如果还要指定字段名称, 这样调用(因为输出的字段名称不一定要和 DataTable 里字段名称的次序相同。
DataTable dt  =  ;
ExcelHelper helper 
=   new  ExcelHelper(
    
new   string []  {"列标题1""列标题2",  }
    
new   string []  {"字段名1""字段名2",  } ,
    dt);
helper.Export();



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值