注: 通过GridView设置数据源后显示NorthWind中某表数据,添加一Button控件,利用如下代码可导出excel,注意着色部分,注只能导出当前页,且00123变成123了。
若有分页等,提示错误如下所示:
“/export2excel”应用程序中的服务器错误。
只能在执行 Render() 的过程中调用 RegisterForEventValidation;
说明:执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。
异常详细信息: System.InvalidOperationException: 只能在执行 Render() 的过程中调用 RegisterForEventValidation;
源错误:
行 55: #endregion
行 56:
行 57: this.GridBMXX.RenderControl(oHtmlTextWriter); //这里应该也可以导出 Repeater 控件中的信息的
行 58: this.GridBMXX.AllowPaging = false;
行 59: Response.Output.Write(oStringWriter.ToString()); |
源文件: d:\export2excel\Default.aspx.cs 行: 57
A;通过修改页文件可以修正这个问题:EnableEventValidation = "false".
<%@ Page Language="C#" EnableEventValidation="false" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> |
Q:最后一列导不出?
-----------------------------------------------------------------------------------------------------------------------------
//将下列代码复制到 .cs 文件中查看
#region GridView 导出 Excel
/// <summary>
/// GridView 导出 Excel
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
//执行导出命令的“Button”所调用的方法
protected void btnDC_Click(object sender, EventArgs e)
{
Export("application/ms-excel", "报名详情表.xls");
}
//导出 Excel 的方法
private void Export(string FileType, string FileName)
{
Response.Clear();
Response.Buffer = true;
Response.Charset = "GB2312";
Response.AppendHeader("Content-Disposition", "attachment;filename=FileName.xls"); //这里之所以没有用传进来的参数,是因为生成的 Excel 文件名若为中文时是乱码
Response.ContentEncoding = System.Text.Encoding.UTF7; // 如果设置为 GetEncoding("GB2312");导出的文件将会出现乱码!!!
Response.ContentType = FileType; //设置输出文件类型为excel文件。
System.IO.StringWriter oStringWriter = new System.IO.StringWriter();
System.Web.UI.HtmlTextWriter oHtmlTextWriter = new System.Web.UI.HtmlTextWriter(oStringWriter);
#region 在导出 Excel 前移除 GridView 的各种样式,但是要移除所有相关元素的样式比较繁琐,所以如果想移除所有样式再导出的话可以新建一个包含 GridView(不含任何样式) 的页面,然后绑定需要的数据再用导出
this.GridBMXX.Columns[this.GridBMXX.Columns.Count - 1].Visible = false; //可以将不想导出的列隐藏(这里隐藏了 GridView 中的最后一列“删除”列)
//this.GridBMXX.HeaderStyle.Reset(); //导出 Excel 前移除 GridView 中 Header 的样式
//this.GridBMXX.RowStyle.Reset(); //导出 Excel 前移除 GridView 中 Row 的样式
//this.GridBMXX.PagerStyle.Reset(); //导出 Excel 前移除 GridView 中 Pager 的样式
//this.GridBMXX.ControlStyle.Reset(); //导出 Excel 前移除 GridView 中 Control 的样式 [ 即套用的 GridView 格式 ]
#endregion
this.GridBMXX.RenderControl(oHtmlTextWriter); //这里应该也可以导出 Repeater 控件中的信息的
this.GridBMXX.AllowPaging = false;
Response.Output.Write(oStringWriter.ToString());
Response.Flush();
Response.End();
}
//下面这个方法是 将 GridView 导出 Excel 时必须需要的,否则会报错,可以去掉查看报错信息
public override void VerifyRenderingInServerForm(Control control)
{
}
//下面可以使当导出的单元格内为较长的数字(如:身份证)时不显示成科学计数法
protected void GridBMXX_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
e.Row.Cells[4].Attributes.Add("style", "vnd.ms-excel.numberformat:@");
e.Row.Cells[5].Attributes.Add("style", "vnd.ms-excel.numberformat:@");
e.Row.Cells[6].Attributes.Add("style", "vnd.ms-excel.numberformat:@");
}
}
#endregion