zoukankan      html  css  js  c++  java
  • Asp.net导出Excel文件

    参考了网上其他大神的写法,也是利用控件的RenderControl功能,得到该控件生成的HTML,然后以Excel文件的类型输出到客户端。

    不同的地方是我自己添加了Response.Flush()方法,这样在生成数据的时候就已经弹出了下载框,而不必在同样的页面等待一会儿。如图:

    点击导出Excel按钮后,直接弹出下载框。

    注:Response.Flush()的作用是将缓冲信息输出到页面。

        /// <summary>
        /// 把DataTable内容导出excel并返回客户端 
        /// </summary>
        /// <param name="header">标题行</param>
        /// <param name="fileName">文件名称</param>
        public void DataTable2Excel(TableCell[] header, string fileName)
        {
           // IO用于导出并返回excel文件 
           var strWriter = new StringWriter();
           var htmlWriter = new HtmlTextWriter(strWriter);
           // 设置编码和附件格式 
           Response.ContentType = "application/ms-excel";
           Response.ContentEncoding = Encoding.GetEncoding("gb2312");
           Response.Charset = "gb2312";
           if (!string.IsNullOrEmpty(fileName))
           {
               fileName = HttpUtility.UrlEncode(fileName, Encoding.UTF8);//处理中文名乱码问题
               Response.AppendHeader("Content-Disposition", ("attachment;filename=" + (fileName.ToLower().EndsWith(".xls") ? fileName : fileName + ".xls")));
           }
           Response.Flush();
           var gvExport = new GridView();// 重新定义一个无分页的GridView var dt = new DataTable();//这里是要导出的数据
           gvExport.DataSource = dt.DefaultView;
           gvExport.AllowPaging = false;
           gvExport.RowDataBound += dgExport_RowDataBound; //优化导出数据显示,如身份证、12-1等显示异常问题
           gvExport.DataBind();
           if (header != null && header.Length > 0)//处理表头
           {
                gvExport.HeaderRow.Cells.Clear();
                gvExport.HeaderRow.Cells.AddRange(header);
           }
           gvExport.RenderControl(htmlWriter);// 返回客户端 
           Response.Write(strWriter);
           Response.End();
        }
        /// <summary>
        /// 用来优化导出数据显示
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void dgExport_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType != DataControlRowType.DataRow) return;
            foreach (var cell in e.Row.Cells.Cast<TableCell>().Where(cell => Regex.IsMatch(cell.Text.Trim(), @"^d{12,}$") || Regex.IsMatch(cell.Text.Trim(), @"^d+[-]d+$")))
            {
                cell.Attributes.Add("style", "vnd.ms-excel.numberformat:@");
            }
        }

    总结:

    1、方法调用时总会报错:Server cannot set content type after HTTP headers have been sent.

      原因:在 Response.AppendHeader 方法调用之前,先调用了Response.Flush()方法。

    2、报错:必须放在具有 runat=server 的窗体标记内.

         解决办法: public override void VerifyRenderingInServerForm(Control control){} //不需要添加内容

  • 相关阅读:
    杭电2054
    M1/M2总结
    软件开发相关的读书笔记 问题与方法
    代码复审1234跟我一起来
    电梯调度算法简述
    Pair_Work Project
    读书笔记摘录:
    Individual Project
    个人阅读作业——软件工程M1/M2的总结
    个人阅读作业2
  • 原文地址:https://www.cnblogs.com/rsls/p/4361895.html
Copyright © 2011-2022 走看看