1、出了问题。代码如下
bd();//这是我绑定数据源的代码
 Response.Clear();
        Response.Buffer = true;
        Response.Charset = "GB2312";
        Response.ContentEncoding = System.Text.Encoding.UTF7;
        Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(FileName, Encoding.UTF8).ToString());//两个参数"application/ms-excel", "User.xls"
        Response.ContentType = FileType;
        this.EnableViewState = false;
        StringWriter tw = new StringWriter();
        HtmlTextWriter hw = new HtmlTextWriter(tw);
        GridView2.RenderControl(hw);//出错的地方-----------------------------------------------
        Response.Output .Write(tw.ToString());
        Response.End();报错的内容是类型“GridView”的控件“GridView2”必须放在具有 runat=server 的窗体标记内。
说明:我的GridView2是放在runat=server 的form内的。
且里面没有模版列,只有数据列。
2、寻求导出Excel的源代码?好的坏的都行,酌情结贴。
3、在线等。

解决方案 »

  1.   


    //override掉这个方法
        public override void VerifyRenderingInServerForm(Control control)
        {
            //注释掉下面的代码,否则在asp.net2.0下会报错(注:GridView是asp.net 2.0下的控件,1.1下一些控件也可以导出成Excel或者Word)
            //base.VerifyRenderingInServerForm(control);
        }楼主是否缺少上述代码?
      

  2.   


    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="ExportDemo.aspx.cs" Inherits="ExportDemo" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>GridView导出到Excel或Word文件</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:GridView ID="gvPersonList" runat="server" AutoGenerateColumns="False">
                <Columns>
                    <asp:BoundField DataField="Id" HeaderText="编号" />
                    <asp:BoundField DataField="Name" HeaderText="姓名" />
                    <asp:TemplateField HeaderText="性别">
                        <ItemTemplate>
                            <%# Eval("Sex").ToString()=="true"?"男":"女" %>
                        </ItemTemplate>
                    </asp:TemplateField>
                    <asp:BoundField DataField="Age" HeaderText="年龄" />
                    <asp:TemplateField HeaderText="婚否">
                        <ItemTemplate>
                            <%# Boolean.Parse(Eval("Married").ToString())==true?"是":"否" %>
                        </ItemTemplate>
                    </asp:TemplateField>
                </Columns>
            </asp:GridView>
            <asp:Button ID="btnToExcel" runat="server" OnClick="btnToExcel_Click" Text="导出到Excel" />
            <asp:Button ID="btnToWord" runat="server" OnClick="btnToWord_Click" Text="导出到Word" />
        </div>
        </form>
    </body>
    </html>
    using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;/// <summary>
    /// 程序说明:这是一个GridView导出成Excel或者Word文件的实例。为了演示,我采用了自动生成DataTable,然后绑定。
    /// 同时为了初学者查看代码方便,关键处我都做了注释。
    /// 对程序说明,在asp.net 1.1中由于对控件呈现不是很严格,所以无需override void VerifyRenderingInServerForm(Control control)这个方法
    /// 但在asp.net2.0中,控件的校验严格了,RenderControl代码只有走正常流程在render方法中它自己调用才能成功,
    /// 在你自己写的事件方法中调用就会出现这个错误。这个错误信息有点误导,你明明写在服务器控件Form内,它照样会这样提醒你,
    /// 实际上是asp.net2.0设置了内部变量控制RenderControl不允许在Render方法之外被轻易调用。如果不override VerifyRenderingInServerForm
    /// 就会报错。我们override void VerifyRenderingInServerForm(Control control)这个方法,里面不写任何代码即可
    /// </summary>
    public partial class ExportDemo : System.Web.UI.Page
    {
        private string firstName = "赵钱孙李周吴郑王冯陈诸卫蒋沈韩杨朱秦尤许何吕施张孔曹严华";
        private string lastName = "猛勇刚强豹彪雁燕蓉菲";
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                BindGridView();
            }
        }    private void BindGridView()
        {
            DataTable myData = CreateDataTable();
            Session["MyData"] = myData;
            gvPersonList.DataSource = myData;
            gvPersonList.DataBind();
        }
        //手动生成DataTable
        private DataTable CreateDataTable()
        {
            DataTable data = new DataTable();
            DataColumn dcId = new DataColumn("ID", typeof(Int32));
            //设置ID列自动递增
            dcId.AutoIncrement = true;
            //设置ID列初始值为1
            dcId.AutoIncrementSeed = 1;
            //设置ID列递增步长为1
            dcId.AutoIncrementStep = 1;
            //将ID列添加到DataTable中
            data.Columns.Add(dcId);
            data.Columns.Add(new DataColumn("Name", typeof(string)));
            data.Columns.Add(new DataColumn("Age", typeof(int)));
            data.Columns.Add(new DataColumn("Sex", typeof(bool)));
            data.Columns.Add(new DataColumn("Married", typeof(bool)));
            DataRow dataRow = null;
            Random random = new Random();
            //随机生成20条记录
            for (int i = 0; i < 20; i++)
            {
                dataRow = data.NewRow();
                //随机生成姓名
                dataRow["Name"] = firstName.Substring(random.Next(firstName.Length), 1) + lastName.Substring(random.Next(lastName.Length), 1);
                //随即生成介于20至100之间的年龄
                int age = random.Next(20, 100);
                dataRow["Age"] = age;
                //随即设置性别
                bool sex = (random.Next(100) % 2 == 0) ? true : false;
                dataRow["Sex"] = sex;
                if (((sex == true) && (age >= 22)) || ((sex == false) && (age >= 20)))//男性结婚年龄大于22周岁,女性结婚年龄大于20周岁
                {
                    dataRow["Married"] = (random.Next(500) % 2 == 0) ? true : false;
                }
                else
                {
                    dataRow["Married"] = false;
                }
                data.Rows.Add(dataRow);
            }
            return data;
        }
        //override掉这个方法
        public override void VerifyRenderingInServerForm(Control control)
        {
            //注释掉下面的代码,否则在asp.net2.0下会报错(注:GridView是asp.net 2.0下的控件,1.1下一些控件也可以导出成Excel或者Word)
            //base.VerifyRenderingInServerForm(control);
        }
        protected void btnToExcel_Click(object sender, EventArgs e)
        {
            Response.Clear();
            Response.BufferOutput = true;
            //设定输出的字符集
            Response.Charset = "GB2312";
            //假定导出的文件名为FileName.xls
            Response.AppendHeader("Content-Disposition", "attachment;filename=FileName.xls");
            Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");
            //设置导出文件的格式
            Response.ContentType = "application/ms-excel";
            //关闭ViewState
            EnableViewState = false;
            System.Globalization.CultureInfo cultureInfo = new System.Globalization.CultureInfo("ZH-CN", true);
            System.IO.StringWriter stringWriter = new System.IO.StringWriter(cultureInfo);
            System.Web.UI.HtmlTextWriter textWriter = new System.Web.UI.HtmlTextWriter(stringWriter);
            gvPersonList.RenderControl(textWriter);
            //把HTML写回浏览器
            Response.Write(stringWriter.ToString());
            Response.End();
        }
        //导出成Word文件
        protected void btnToWord_Click(object sender, EventArgs e)
        {
            Response.Clear();
            Response.BufferOutput = true;
            //设定输出的字符集
            Response.Charset = "GB2312";
            //假定导出的文件名为FileName.doc
            Response.AppendHeader("Content-Disposition", "attachment;filename=FileName.doc");
            Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");
            ////设置导出文件的格式
            Response.ContentType = "application/ms-word";
            //关闭ViewState
            gvPersonList.EnableViewState = false;
            System.Globalization.CultureInfo cultureInfo = new System.Globalization.CultureInfo("ZH-CN", true);
            System.IO.StringWriter stringWriter = new System.IO.StringWriter(cultureInfo);
            System.Web.UI.HtmlTextWriter textWriter = new System.Web.UI.HtmlTextWriter(stringWriter);
            gvPersonList.RenderControl(textWriter);
            // //把HTML写回浏览器
            Response.Write(stringWriter.ToString());
            Response.End();
        }
    }
      

  3.   


        #region 导出Excel方法
        private void Export(string FileType, string FileName)
        {
            //清楚分页
            GridView1.AllowPaging = false;
            BindData();        Response.Clear();
            Response.Buffer = true;
            //设定输出的字符集
            Response.Charset = "GB2312";
            //解决导出到Excel2007乱码问题
            Response.Write("<meta http-equiv=Content-Type content=text/html;charset=GB2312>");        //假定导出的文件名为盘点结果表.xls
            Response.AppendHeader("Content-Disposition", "attachment;filename=" +
                                 HttpUtility.UrlEncode(FileName, Encoding.UTF8).ToString());
            //解决导出到Excel2007乱码问题
            Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");        //设置导出文件的格式
            Response.ContentType = FileType;
            //关闭ViewState
            this.EnableViewState = false;
            StringWriter stringWriter = new StringWriter();
            HtmlTextWriter textWriter = new HtmlTextWriter(stringWriter);
            GridView1.RenderControl(textWriter);
            //把HTML写回浏览器
            Response.Write(stringWriter.ToString());
            Response.Flush();
            Response.End();
            GridView1.AllowPaging = true;//恢复分页
            //为GridView重新绑定数据源
            BindData();    }    #endregion
      

  4.   

     public  void CreateExcel(DataSet ds, string sheetName, string fileName, string[] columnName, string[] columnData)
        {
            StringBuilder strb = new StringBuilder();
            strb.Append(" <html xmlns:o=\"urn:schemas-microsoft-com:office:office\"");
            strb.Append("xmlns:x=\"urn:schemas-microsoft-com:office:excel\"");
            strb.Append("xmlns=\"http://www.w3.org/TR/REC-html40\"");
            strb.Append(" <head> <meta http-equiv='Content-Type' content='text/html; charset=gb2312'>");
            strb.Append(" <style>");
            strb.Append(".xl26");
            strb.Append(" {mso-style-parent:style0;");
            strb.Append(" font-family:\"Times New Roman\", serif;");
            strb.Append(" mso-font-charset:0;");
            strb.Append(" mso-number-format:\"@\";}");
            strb.Append(" </style>");
            strb.Append(" <xml>");
            strb.Append(" <x:ExcelWorkbook>");
            strb.Append("  <x:ExcelWorksheets>");
            strb.Append("  <x:ExcelWorksheet>");
            //设置工作组名
            strb.Append("    <x:Name>" + sheetName.ToString().Trim() + "</x:Name>");        strb.Append("    <x:WorksheetOptions>");
            strb.Append("    <x:DefaultRowHeight>285 </x:DefaultRowHeight>");
            strb.Append("    <x:Selected/>");
            strb.Append("    <x:Panes>");
            strb.Append("      <x:Pane>");
            strb.Append("      <x:Number>3 </x:Number>");
            strb.Append("      <x:ActiveCol>1 </x:ActiveCol>");
            strb.Append("      </x:Pane>");
            strb.Append("    </x:Panes>");
            strb.Append("    <x:ProtectContents>False </x:ProtectContents>");
            strb.Append("    <x:ProtectObjects>False </x:ProtectObjects>");
            strb.Append("    <x:ProtectScenarios>False </x:ProtectScenarios>");
            strb.Append("    </x:WorksheetOptions>");
            strb.Append("  </x:ExcelWorksheet>");
            strb.Append("  <x:WindowHeight>6750 </x:WindowHeight>");
            strb.Append("  <x:WindowWidth>10620 </x:WindowWidth>");
            strb.Append("  <x:WindowTopX>480 </x:WindowTopX>");
            strb.Append("  <x:WindowTopY>75 </x:WindowTopY>");
            strb.Append("  <x:ProtectStructure>False </x:ProtectStructure>");
            strb.Append("  <x:ProtectWindows>False </x:ProtectWindows>");
            strb.Append(" </x:ExcelWorkbook>");
            strb.Append(" </xml>");
            strb.Append("");
            strb.Append(" </head> <body> <table align=\"center\" style='border-collapse:collapse;table-layout:fixed';> <tr>");
            if (ds.Tables.Count > 0)
            {            //写列标题
                int columncount = ds.Tables[0].Columns.Count;            foreach (string title in columnName)
                {
                    strb.Append(" <td> <b>" + title + " </b> </td>");
                }            strb.Append(" </tr>");            //写数据
                for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
                {
                    strb.Append(" <tr>");
                    foreach (string str in columnData)
                    {
                        strb.Append(" <td class='xl26'>" + ds.Tables[0].Rows[i][str].ToString() + " </td>");
                    }
                    strb.Append(" </tr>");
                }        }
            strb.Append(" </body> </html>");        Response.Clear();
            Response.Buffer = true;
            Response.Charset = "GB2312";
            Response.AppendHeader("Content-Disposition", "attachment;filename=" + fileName);
            Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");//设置输出流为简体中文
            Response.ContentType = "application/ms-excel";//设置输出文件类型为excel文件。         
            this.EnableViewState = false;
            Response.Write(strb);
            Response.Flush();
            Response.End();    }注意:Response.Write()输出的excel都是伪excel,不是真正的excel。这种格式的excel无法导入数据库。
      

  5.   

    最简单的方法,很方便用,但是不支持excel的分页
    Response.Clear();
            Response.Buffer = true;
            Response.Charset = "GB2312";
            Response.AppendHeader("Content-Disposition", "attachment;filename=FileName.xls");
            //gaoyang [10/21/2006] 经测试如果设置为 GetEncoding("GB2312"),导出的文件将会出现乱码。
            Response.ContentEncoding = System.Text.Encoding.UTF7;        //设置输出文件类型为excel文件。 
            Response.ContentType = "application/ms-excel";
            System.IO.StringWriter oStringWriter = new System.IO.StringWriter();
            System.Web.UI.HtmlTextWriter oHtmlTextWriter = new System.Web.UI.HtmlTextWriter(oStringWriter);
            this.GridView1.RenderControl(oHtmlTextWriter);
            Response.Output.Write(oStringWriter.ToString());
            Response.Flush();
            Response.End();
      

  6.   

    //对分页没影响,数据可以全部导出,唯一的缺点是要指出数据源.
            HttpContext curContext = System.Web.HttpContext.Current;
            System.IO.StringWriter strWriter = new StringWriter();
            System.Web.UI.HtmlTextWriter htmlWriter = new HtmlTextWriter(strWriter);
            curContext.Response.ContentType = "application/vnd.ms-excel";
            curContext.Response.ContentEncoding = Encoding.GetEncoding("GB2312");
            curContext.Response.Charset = "GB2312";        string query = "SELECT * FROM tbEmployeeM";
            SqlConnection myConnection = new SqlConnection(ConnectString);
            SqlDataAdapter ad = new SqlDataAdapter(query, myConnection);
            DataSet ds = new DataSet();
            ad.Fill(ds, "tbEmployeeM");
                    GridView GV = new GridView();//一个无分页的GridView
            GV.DataSource = ds;
            GV.AllowPaging = false;//这个改为false会出错
            GV.DataBind();
            GV.RenderControl(htmlWriter);
            curContext.Response.Write(strWriter.ToString());
            curContext.Response.End();
      

  7.   

    加这段代码即可:
    public override void VerifyRenderingInServerForm(Control control)
    {    //base.VerifyRenderingInServerForm(control);
    }
      

  8.   

    牛人成堆,郁闷了,啥时候俺也能成为zhanglixue、oulei2008、cailee这样的高手呀!