Gridview导出到Excel并下载

来源:互联网 发布:宇通 金龙 知乎 编辑:程序博客网 时间:2024/05/01 10:31

公共方法:

 /// <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;

        }

   }

 


 

原创粉丝点击