GridView中的数据导入到EXCel中

本文介绍了一种使用ASP.NET中的GridView控件导出数据至Excel的方法,并解决了运行时出现的‘类型“GridView”的控件“gv”必须放在具有runat=server的窗体标记内’的错误。

 /// <summary>
    /// 创建一个GridView并为其绑定数据
    /// </summary>
    /// <returns></returns>
    protected GridView CreateGridView()
    {
        GridView gv = new GridView();
        DataTable  db=null;
        BoundField boundField = null;

        boundField = new BoundField();
        boundField.DataField = "object_class";
        boundField.HeaderText = "网元类型";
        gv.Columns.Add(boundField);

        boundField = new BoundField();
        boundField.DataField = "version";
        boundField.HeaderText = "版本信息";
        gv.Columns.Add(boundField);

        boundField = new BoundField();
        boundField.DataField = "vendor_id";
        boundField.HeaderText = "厂家";
        gv.Columns.Add(boundField);

        gv.AutoGenerateColumns = false;
        db = (DataTable)ViewState["db"];
        dv = db.DefaultView;
        gv.DataBind();
        return gv;
    }

    /// <summary>
    /// 导出数据到EXCEL中
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void btnDown_Click(object sender, EventArgs e)
    {
        //设置datagrid界面样式,即保存给excel的样式
        string strFileName = "Version.xls";

        GridView gv = CreateGridView();//创建一个GridView

        gv.SelectedRowStyle.BackColor = Color.White;
        gv.AlternatingRowStyle.BackColor = Color.White;
        gv.RowStyle.BackColor = Color.White;
        gv.HeaderStyle.BackColor = Color.Silver;
        gv.HeaderStyle.ForeColor = Color.Black;
        gv.BorderColor = Color.Black;

        //保存数据到excel
        Response.ContentType = "application/ms-excel";
        Response.Charset = "";          //从Content-Type header中去除charset设置

        Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");   //解决中文乱码之关键     
        Response.AppendHeader("Content-Disposition", "attachment;filename=" + strFileName);   //必要,做成下载文件

        EnableViewState = false;
        System.IO.StringWriter stwExcel = new System.IO.StringWriter();
        HtmlTextWriter htwExcel = new System.Web.UI.HtmlTextWriter(stwExcel);
        htwExcel.AddAttribute(HtmlTextWriterAttribute.Title, "charset=gb2312");
        htwExcel.Write("<META>");

        gv.RenderControl(htwExcel);

        Response.Write(stwExcel.ToString());
        Response.End();
        htwExcel.Close();
        stwExcel.Close();
    }

说明:运行时发生““类型“GridView”的控件“gv”必须放在具有 runat=server 的窗体标记内。”的错误。

解决办法:在页面中重写Page基类的VerifyRenderingInServerForm方法
   public override void VerifyRenderingInServerForm(Control control)
   {
   // Confirms that an HtmlForm control is rendered for
   }

MSDN对该方法的解释如下: 
必须位于 <form runat=server> 标记中的控件可以在呈现之前调用此方法,以便在控件被置于标记外时显示错误信息。发送回或依赖于注册的脚本块的控件应该在 Control.Render 方法的重写中调用此方法。呈现服务器窗体元素的方式不同的页可以重写此方法以在不同的条件下引发异常。 
如果回发或使用客户端脚本的服务器控件没有包含在 HtmlForm 服务器控件 (<form runat="server">) 标记中,它们将无法正常工作。这些控件可以在呈现时调用该方法,以在它们没有包含在 HtmlForm 控件中时提供明确的错误信息。

如在运行时遇到“只能在执行 Render() 的过程中调用 RegisterForEventValidation(RegisterForEventValidation can only be called during Render(); ) ”错误

解决办法:直接在导出Execl的页面修改

<%@ Page Language="C#" EnableEventValidation = "false" AutoEventWireup="true"

 CodeFile="ExportGridView.aspx.cs" Inherits="ExportGridView" %>


 

转载于:https://www.cnblogs.com/S-TGM/archive/2009/11/19/1606266.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值