DataGrid导出Excel遇到的一些问题

    技术2022-05-11  51

    项目需要,最近一直在弄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)