[原创] GridView[DataGrid]导出成Excel文件的万能解决方法
GridView[DataGrid]导出成Excel文件在Dot.Net使用群中是个很大的问题了,
随便一搜,都会搜出一大堆的。而好多实现要依赖于Office软件自带的ActiveX,
基于ActiveX的实现,必然会出现"Dll Hell"的问题,所以并不可取。
最好的方法是保持原来Web页面原样,而且不依赖于Office的ActiveX,这个方法
网上流传很广了,不过我在使用的过程中发现有一些问题,结合自己的解决和未解决的问题,
写如下一篇文章,以期的到抛砖引玉的效果^-^
这个就是网上流传的代码了,我做了适当的修改:
/*
网事如风
ExcelGridView :需要导出的GridView
FileName :保存出来的Excel文件名,需要加文件名后缀
*/
public
void
GridViewToExcel(GridView ExcelGridView,
string
FileName)
{
bool OldAllowPaging = ExcelGridView.AllowPaging;
if ( OldAllowPaging )
ExcelGridView.AllowPaging = !OldAllowPaging;
// 重新绑定.
ExcelGridView.DataBind();
//有时用 gb2312 不能正常显示中文,要用 utf-8
Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");
//必要,做成下载文件
Response.AppendHeader("Content-Disposition", "attachment;filename=" + FileName); 
//如果要直接在浏览器中打开,把上行注释掉,换成下面这行
//Response.ContentType = "application/vnd.ms-excel";
Response.Charset = ""; 
//关闭 ViewState
this.EnableViewState = false;
System.IO.StringWriter tw = new System.IO.StringWriter();
System.Web.UI.HtmlTextWriter hw = new HtmlTextWriter(tw);//获取control的HTML
ExcelGridView.RenderControl(hw);
Response.Write(tw.ToString());
Response.End();
ExcelGridView.AllowPaging = OldAllowPaging;
}
如上代码如果处理一般的GridView导出应该是没有问题的,但是如果GridView的AutoGenerateDeleteButton,AutoGenerateEditButton,
AutoGenerateSelectButton有的设置为True了,或者GridView中有HyperLinkField类型的字段,那么就会抛出形如
“类型“GridView”的控件“XXXX”必须放在具有 runat=server 的窗体标记内。”的异常!
关于生成这个错误的原因请见:
http://www.cnblogs.com/rchen/archive/2005/03/22/123592.html
那么他的解决方案是:对WebForm窗体的VerifyRenderingInServerForm方法进行Override!
代码如下:
//
必须要
public
override
void
VerifyRenderingInServerForm(Control control)
{
//OverRide 为了使导出成Excel可行!
}
再附上微软的MSDN的帮助:
===========================================
Page.VerifyRenderingInServerForm 方法
确认在运行时为指定的 ASP.NET 服务器控件呈现 HTMLForm 控件。
[C#]
public
virtual
void
VerifyRenderingInServerForm(Control control);
参数control
ASP.NET 服务器控件,它必须位于 HTMLForm 控件中。
异常
异常类型
条件
HttpException 指定的服务器控件在运行时不包含在 HTMLForm 服务器控件的开始和结束标记之间。
备注
如果该页当前不处于页处理中的呈现阶段,且位于 <form runat=server> 标记内,则该方法将引发异常。需要位于服务器窗体内的控件可以
在呈现期间调用该方法,以便在它们被放置到外面时显示明确的错误信息。发送回或依赖于注册的脚本块的控件应该在 Control.Render 方法
的重写中调用该方法。呈现服务器窗体元素的方式不同的页可以重写该方法以在不同的条件下引发异常。
如果回送或使用客户端脚本的服务器控件没有包含在 HTMLForm 服务器控件 (<form runat="server">) 中,它们将无法正常工作。这些控件
可以在呈现时调用该方法,以在它们没有包含在 HTMLForm 控件中时提供明确的错误信息。
开发自定义服务器控件时,通常在为任何类型的输入标记重写 Render 方法时调用该方法。这在输入控件调用 GetPostBackEventReference
或发出客户端脚本时尤其重要。复合服务器控件不需要作出此调用。
除非要创建替换页框架,否则请不要重写此方法。
===========================================
这个就满足上面的条件导出成Excel文件了.
不过这个方法并没有解决GridView内嵌控件比如CheckBox的导出,我所遇到的是在GridView的第一行是供选择的CheckBox,
所以我加了一句
ExcelGridView.Columns[
0
]. Visible
=
false
;
//
去掉第一列CheckBox
解决了这个问题,不过办法很笨,所以算是万能之中的瑕疵吧,等待大家给出解决方案^-^
GridView导出Excel
本文介绍了一种不依赖Office ActiveX的GridView导出为Excel的方法,适用于.NET环境,并解决了导出时可能出现的异常问题。
759





