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){} //不需要添加内容

转载于:https://www.cnblogs.com/rsls/p/4361895.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值