VS2005中 GridView导入Excel的导入需要注意的几点

最近带的项目遇到GridView导入Excel问题,总结出几点:

1、如果出现下面的错误提示可用重载VerifyRenderingInServerForm方法解决。

错误提示:
类型“GridView”的控件“GridView1”必须放在具有 runat=server 的窗体标记内

在后台文件中重载VerifyRenderingInServerForm方法,如:
public override void VerifyRenderingInServerForm(Control control)
{
  //base.VerifyRenderingInServerForm(control);
}

2、如果设置为 GetEncoding("GB2312"),导出的文件将会出现乱码。

可用Response.ContentEncoding = System.Text.Encoding.UTF7;
或者Encoding.UTF8等来解决,不过导入格式和字体上个人感觉UTF7比UTF8效果好些;
因人而异了:)

相关代码如下:

Web.config配置:

<?xml version="1.0"?>
<!--
  注意: 除了手动编辑此文件以外,您还可以使用
  Web 管理工具来配置应用程序的设置。可以使用 Visual Studio 中的
  “网站”->“Asp.Net 配置”选项。
  设置和注释的完整列表在
  machine.config.comments 中,该文件通常位于
  \Windows\Microsoft.Net\Framework\v2.x\Config 中
-->
<configuration>
  <appSettings>
    <!--数据库连接串-->
    <add key="ConnectionString" value="data source=.;initial catalog=Northwind;user id=sa;password=sa;persist security info=true;packet size=4096"/>
  </appSettings>
  <connectionStrings/>
  <system.web>
    <!--
        设置 compilation debug="true" 将调试符号插入
        已编译的页面中。但由于这会
        影响性能,因此只在开发过程中将此值
        设置为 true。
    -->
    <compilation debug="true"/>
    <!--
        通过 <authentication> 节可以配置 ASP.NET 使用的
        安全身份验证模式,
        以标识传入的用户。
    -->
    <authentication mode="Windows"/>
    <!--
        如果在执行请求的过程中出现未处理的错误,
        则通过 <customErrors> 节可以配置相应的处理步骤。具体说来,
        开发人员通过该节可以配置
        要显示的 html 错误页
        以代替错误堆栈跟踪。

    <customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">
        <error statusCode="403" redirect="NoAccess.htm" />
        <error statusCode="404" redirect="FileNotFound.htm" />
    </customErrors>
    -->
  </system.web>
</configuration>

ASPX页面代码:



<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!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>无标题页</title>
</head>
<body>
  <form id="form1" runat="server">
  <div>
     
    <asp:GridView ID="GridView1" runat="server" AllowPaging="true" OnPageIndexChanging="Paging">
    </asp:GridView>
 
  </div>
    <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="导出到Excel" />
  </form>

</body>
</html>


实例代码:

/**//*
*   // by XiaoYin [10/22/2006]
*/
using System;
using System.Data;
using System.Configuration;
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;
using System.Data.SqlClient;
using System.Xml;

public partial class _Default : System.Web.UI.Page
{

  /**//// <summary>
  /// 链接字符串
  /// </summary>
  public string ConnectString
  {
    get
    {
        return ConfigurationManager.AppSettings["ConnectionString"];
    }
  }

  /**//// <summary>
  /// 重载VerifyRenderingInServerForm方法
  /// 确认在运行时为指定的 ASP.NET 服务器控件呈现 HtmlForm 控件。
  /// </summary>
  /// <param name="control">ASP.NET 服务器控件,它必须位于 HtmlForm 控件中</param>
  public override void VerifyRenderingInServerForm(Control control)
  {
    //base.VerifyRenderingInServerForm(control);
  }


  protected void Page_Load(object sender, EventArgs e)
  {
    if (!Page.IsPostBack)
    {
        BindData();
    }
  }

  /**//// <summary>
  /// 绑定数据
  /// </summary>
  public void BindData()
  {
    // 查询
    string query = "SELECT * FROM Categories";
    SqlConnection myConnection = new SqlConnection(ConnectString);
    SqlDataAdapter ad = new SqlDataAdapter(query, myConnection);
    DataSet ds = new DataSet();
    ad.Fill(ds, "Categories");
    GridView1.DataSource = ds;
    GridView1.DataBind();
  }

  /**//// <summary>
  /// 内存分页
  /// </summary>
  /// <param name="sender"></param>
  /// <param name="e"></param>
  protected void Paging(object sender, GridViewPageEventArgs e)
  {
    GridView1.PageIndex = e.NewPageIndex;
    BindData();
  }

  protected void Button1_Click(object sender, EventArgs e)
  {
    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();
  }
}
posted on 2006-11-29 08:56  冷火  阅读(406)  评论(0编辑  收藏  举报