公共方法:
/// <summary>
/// 导出GridView中的数据到磁盘上的指定文件,然后下载
/// </summary>
/// <param name="gv">要导出的数据GridView</param>
/// <param name="fileName">文件名</param>
/// <param name="typeName">要导出的文件类型如:application/ms-excel</param>
public static void ExportToExcelFromGV(System.Web.UI.WebControls.GridView gv, string fileName, string typeName)
{
try
{
System.Web.HttpResponse httpResponse = System.Web.HttpContext.Current.Response;
httpResponse.AppendHeader("Content-Disposition", "attachment;filename=" + System.Web.HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8));
httpResponse.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");
httpResponse.ContentType = typeName;
using (System.IO.StringWriter tw = new System.IO.StringWriter())
{
System.Web.UI.HtmlTextWriter hw = new System.Web.UI.HtmlTextWriter(tw);
gv.RenderControl(hw);
string filePath = System.Web.HttpContext.Current.Server.MapPath("~/") + fileName;
using (System.IO.StreamWriter sw = System.IO.File.CreateText(filePath))
{
sw.Write(tw.ToString());
}
DownFile(httpResponse, fileName, filePath);
httpResponse.End();
}
}
catch (Exception e)
{
//System.Web.HttpContext.Current.Response.Write(e.Message);
}
}
/// 下载服务器上已有文件
/// </summary>
/// <param name="fileName">保存到客户端时的文件名</param>
/// <param name="filePath">下载文件在服务器上所在物理路径全名</param>
public static void DownloadFile(String fileName, String filePath)
{
FileInfo fileInfo = new FileInfo(filePath);
System.Web.HttpContext.Current.Response.Clear();
System.Web.HttpContext.Current.Response.ClearContent();
System.Web.HttpContext.Current.Response.ClearHeaders();
System.Web.HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=" + fileName);
System.Web.HttpContext.Current.Response.AddHeader("Content-Length", fileInfo.Length.ToString());
System.Web.HttpContext.Current.Response.AddHeader("Content-Transfer-Encoding", "binary");
System.Web.HttpContext.Current.Response.ContentType = "application/octet-stream";
System.Web.HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");
System.Web.HttpContext.Current.Response.WriteFile(fileInfo.FullName);
System.Web.HttpContext.Current.Response.Flush();
System.Web.HttpContext.Current.Response.End();
}
注意在具体调用该方法的页面中必须加入以下方法:
/// <summary>
/// 必须加该方法,否则没法导出GridView数据,页面文件要加入 EnableEventValidation="false"
/// </summary>
/// <param name="control"></param>
public override void VerifyRenderingInServerForm(Control control)
{
}
而且在页面文件中还要加入 EnableEventValidation="false"
<%@ Page Language="C#" AutoEventWireup="true" EnableEventValidation="false" CodeFile="Test.aspx.cs"
Inherits="Test" %>
如果对要导出的Excel文件有格式要求,可以在GridView的 OnRowDataBound方法中做设定:
protected void GridView3_OnDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
//给第一个单元格设置格式为文本
e.Item.Cells[0].Attributes.Add("style", "vnd.ms-excel.numberformat:@");
//给第四个单元格设置格式为货币:
e.Item.Cells[3].Attributes.Add("style", "vnd.ms-excel.numberformat:¥#,###.00");
//1) 文本:vnd.ms-excel.numberformat:@
//2) 日期:vnd.ms-excel.numberformat:yyyy/mm/dd
//3) 数字:vnd.ms-excel.numberformat:#,##0.00
//4) 货币:vnd.ms-excel.numberformat:¥#,##0.00
//5) 百分比:vnd.ms-excel.numberformat: #0.00%
}
if (e.Row.RowType == DataControlRowType.Header)
{
e.Row.Cells[0].BackColor = Color.Green;
}
}