ASP.NET中导出Excel的几个问题
1、将GridView控件数据导出到Excel源代码
/// 导出数据为Excel
/// </summary>
/// <param name="gv">数据源控件</param>
/// <param name="fileName">文件名</param>
private void ExportToExcel(GridView gv, string fileName)
{
System.Web.HttpResponse Response = this.Page.Response;
Response.Clear();
Response.Buffer = true;
Response.Charset = "UTF-8";
Response.AppendHeader("Content-Disposition", "attachment;filename=" + Server.UrlPathEncode(fileName) + ".xls");
Response.ContentEncoding = System.Text.Encoding.UTF8;
Response.ContentType = "application/ms-excel";//设置输出文件类型为excel文件
System.IO.StringWriter oStringWriter = new System.IO.StringWriter();
System.Web.UI.HtmlTextWriter oHtmlTextWriter = new System.Web.UI.HtmlTextWriter(oStringWriter);
gv.RenderControl(oHtmlTextWriter);
Response.Write(oStringWriter.ToString());
Response.Flush();
Response.End();
}
2、问题一:控件必须放在具有“runat=server”的窗体标记内
解决办法:在页面中重写Page基类的VerifyRenderingInServerForm方法
{
// Confirms that an HtmlForm control is rendered for
}
3、只能在执行 Render()的过程中调用 RegisterForEventValidation
当用GridView导出Execl的时候,会发生只能在执行Render()的过程中调用RegisterForEventValidation的错误提示。
有两种方法可以解决以上问题:
(1)修改web.config(不推荐)<pages enableEventValidation ="false" ></pages>
(2)直接在导出Execl的页面修改,加上EnableEventValidation = "false"属性
Inherits="frmFormTrace" EnableEventValidation = "false"%>
4、Excel中的中文数据为乱码
//HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.GetEncoding("UTF-8");
//用下面的这语句代替上面两句,可避免Excel/Word内容出现乱码问题
HttpContext.Current.Response.Write("<meta http-equiv='Content-Type' content='text/html';charset='UTF-8'>");
5、GridView导出Excel出现科学计数的解决办法
GridView将数据导入Excel发现:如果数字位数超过15位,保存的时候会自动转为科学计数法,但会将15位后的数字变为零,如身份证号码!这样得到的数据和原来的不一致,这是Excel自动识别的问题。如下图:
图1 导出前
图2 导出后
在网上搜索了一下解决方法,如下:
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
e.Row.Cells[6].Attributes.Add("style", "vnd.ms-excel.numberformat:@");
}
}