Asp.net导出Excel文件

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

 1 /// <summary>
 2     /// 把DataTable内容导出excel并返回客户端 
 3     /// </summary>
 4     /// <param name="header">标题行</param>
 5     /// <param name="fileName">文件名称</param>
 6     public void DataTable2Excel(TableCell[] header, string fileName)
 7     {
 8        // IO用于导出并返回excel文件 
 9        var strWriter = new StringWriter();
10        var htmlWriter = new HtmlTextWriter(strWriter);
11        // 设置编码和附件格式 
12        Response.ContentType = "application/ms-excel";
13        Response.ContentEncoding = Encoding.GetEncoding("gb2312");
14        Response.Charset = "gb2312";
15        if (!string.IsNullOrEmpty(fileName))
16        {
17            fileName = HttpUtility.UrlEncode(fileName, Encoding.UTF8);//处理中文名乱码问题
18            Response.AppendHeader("Content-Disposition", ("attachment;filename=" + (fileName.ToLower().EndsWith(".xls") ? fileName : fileName + ".xls")));
19        }
20        Response.Flush();
21        var gvExport = new GridView();// 重新定义一个无分页的GridView var dt = new DataTable();//这里是要导出的数据
22        gvExport.DataSource = dt.DefaultView;
23        gvExport.AllowPaging = false;
24        gvExport.RowDataBound += dgExport_RowDataBound; //优化导出数据显示,如身份证、12-1等显示异常问题
25        gvExport.DataBind();
26        if (header != null && header.Length > 0)//处理表头
27        {
28             gvExport.HeaderRow.Cells.Clear();
29             gvExport.HeaderRow.Cells.AddRange(header);
30        }
31        gvExport.RenderControl(htmlWriter);// 返回客户端 
32        Response.Write(strWriter);
33        Response.End();
34     }
 1 /// <summary>
 2     /// 用来优化导出数据显示
 3     /// </summary>
 4     /// <param name="sender"></param>
 5     /// <param name="e"></param>
 6     protected void dgExport_RowDataBound(object sender, GridViewRowEventArgs e)
 7     {
 8         if (e.Row.RowType != DataControlRowType.DataRow) return;
 9         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+$")))
10         {
11             cell.Attributes.Add("style", "vnd.ms-excel.numberformat:@");
12         }
13     }

总结:

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

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。