GridViewをExcelまたはWordファイルにエクスポート
フロントページ:
注意すべきは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です.
<%@ 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();
}