GridViewをExcelまたはWordファイルにエクスポート


フロントページ:
 
   
<%@ Page Language="C#" AutoEventWireup="true" EnableEventValidation="false" CodeFile="Default4.aspx.cs" Inherits="Default4" %>

<!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="gvPersonList" runat="server" AutoGenerateColumns="False" 
            AllowPaging="True" onpageindexchanging="gvPersonList_PageIndexChanging">
    <Columns>
    <asp:TemplateField HeaderText="  ">
    <ItemTemplate>
    <asp:Label ID="Label1" runat="server" Text='<%# Bind("Id") %>'></asp:Label>
    </ItemTemplate>
    </asp:TemplateField>
    <asp:BoundField DataField="Name" HeaderText="  " />
    <asp:TemplateField HeaderText="  ">
    <ItemTemplate>
    <asp:Label ID="Label2" runat="server" 
    Text='<%# Eval("Sex").ToString().ToLower()=="true"?" ":" " %>'></asp:Label>
    </ItemTemplate>
    </asp:TemplateField>
     <asp:TemplateField HeaderText="  ">
     <ItemTemplate>
     <asp:Label ID="Label3" runat="server" 
     Text='<%#Boolean.Parse(Eval("Married").ToString())==true?" ":" " %>'></asp:Label>
     </ItemTemplate>
     </asp:TemplateField>
     </Columns>
     </asp:GridView>
     <asp:Button ID="btnToExcel" runat="server" Text="  Excel" 
      onclick="btnToExcel_Click" />
     <asp:Button ID="btnToWord" runat="server" Text="  Word" 
      onclick="btnToWord_Click" />
    </div>
    </form>
</body>
</html>

 
 
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;

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

    private string firstName = "                            ";
    private String lastName = "          ";

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

    //    GridView  
    private void BindGridView()
    {
        gvPersonList.DataSource = CreateDataTable();
        gvPersonList.DataBind();
    }

    //    DataTable
    private DataTable CreateDataTable()
    {
        DataTable data = new DataTable();
        //ID 
        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();
        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);
            //      
            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)
            {
                dataRow["Married"] = (random.Next(500) % 2 == 0) ? true : false;
            }
            else
            {
                dataRow["Married"] = false;
            }

            data.Rows.Add(dataRow);
        }

        return data;
    }

    /// <summary>
    ///       
    /// </summary>
    /// <param name="FileType">    MIME  </param>
    /// <param name="FileName">       </param>
    private void Exprot(String FileType, String FileName)
    {
        Response.Clear();
        Response.BufferOutput = true;
        //       
        Response.Charset = "GB2312";
        Response.ContentEncoding = System.Text.Encoding.UTF8;
        Response.AppendHeader("Content-Disposition", "attachment;filename="
        + HttpUtility.UrlEncode(FileName, System.Text.Encoding.UTF8));
        //     HttpMiME  (      )
        Response.ContentType = FileType;
        //  ViewState
        Page.EnableViewState = false;
        System.Globalization.CultureInfo cultureInfo = new System.Globalization.CultureInfo("ZH-CN", true);
        System.IO.StringWriter stringWriter = new System.IO.StringWriter(cultureInfo);
        HtmlTextWriter textWriter = new HtmlTextWriter(stringWriter);
        gvPersonList.RenderControl(textWriter);
        // HTML     
        Response.Write(stringWriter.ToString());
        Response.End();
        Response.Flush();
    }

    //  Excel
    protected void btnToExcel_Click(object sender, EventArgs e)
    {
        //Response.Clear();
        //Response.BufferOutput = true;
        ////        
        //Response.Charset = "utf-8";
        ////         FileName.xls
        //Response.AppendHeader("Content-Disposition", "attachment;filename=FileName.xls");
        //Response.ContentEncoding = System.Text.Encoding.GetEncoding("utf-8");
        ////         
        //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();
        Exprot("application/ms-excel","Employee.xls");
    }

    //  Word
    protected void btnToWord_Click(object sender, EventArgs e)
    {
        //               
        Exprot("application/ms-word", "Employee.doc");
    }

    //           ASP.NET          HtmlForm    。
    //(  Asp.Net          HTMLForm   )
    public override void VerifyRenderingInServerForm(Control control)
    {
    /*      , 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)    ,
    *           */
       //base.VerifyRenderingInServerForm(control);
    }

    /// <summary>
    ///   
    /// </summary>
    protected void gvPersonList_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
        gvPersonList.PageIndex = e.NewPageIndex;
        BindGridView();
    }
}

 
注意すべきはasp.net2.0環境でVerifyRenderingInServerForm(Control control)というメソッドがoverrideでない場合、runat=serverを持つフォームタグに「エラーメッセージ:タイプGridView」のコントロール「GridView 1」を入れなければならない」というエラーが発生します.
ページングの場合、1ページ分のデータを取得したくない場合は、すべてのデータをエクスポートする必要があります.
1.gridviewの内容はページングで表示される可能性があるため、ここではexcelをエクスポートするたびにgridviewのallowpaging属性をfalseに設定し、databind()をクリックして、すべてのデータが得られることを確保する.
2.エクスポートのパスを個別に設定しなくても、エクスポート時にダイアログボックスが開き、保存場所を確認できます.
3.空のVerifyRenderingInServerFormメソッド(必ず書く)を書くには、実行時に指定されたASPであることを確認します.NETサーバーコントロールはHtmlFormコントロールを表示する.
4.エクスポート後、allowpagingプロパティを再設定することを忘れないでください.これらをすべて設定したら、[書き出し]をクリックすると、Render()の実行中にのみRegisterForEventValidation(RegisterForEventValidation can only be called during Render()を呼び出すことができます.)のエラーをチェックして、またコードをチェックして、問題を発見していないで、しばらくして出てこないで、それから検索して、解決方法を発見しました:あなたのaspxファイルの中の:<%@Page Language=“C#”EnableEventValidation=“false”AutoEventWireup=“true”CodeFile=“SysUser.aspx.cs”Inherits=“Autho_SysUser 2”%>
赤い部分を増やしてOKです.
 
 protected void btnToWord_Click(object sender, EventArgs e)
    {
        gvPersonList.AllowPaging = false;
        gvPersonList.AllowSorting = false;
        BindGridView();
        Exprot("application/ms-word", "Employee.doc");
        gvPersonList.AllowPaging = true;
        gvPersonList.AllowSorting = true;
        BindGridView();
    }