參考了網(wǎng)上其他大神的寫法,也是利用控件的RenderControl功能,得到該控件生成的HTML,然后以Excel文件的類型輸出到客戶端。
不同的地方是我自己添加了Response.Flush()方法,這樣在生成數(shù)據(jù)的時(shí)候就已經(jīng)彈出了下載框,而不必在同樣的頁(yè)面等待一會(huì)兒。如圖:

點(diǎn)擊導(dǎo)出Excel按鈕后,直接彈出下載框。
注:Response.Flush()的作用是將緩沖信息輸出到頁(yè)面。
/// <summary> /// 把DataTable內(nèi)容導(dǎo)出excel并返回客戶端 /// </summary> /// <param name="header">標(biāo)題行</param> /// <param name="fileName">文件名稱</param> public void DataTable2Excel(TableCell[] header, string fileName) { // IO用于導(dǎo)出并返回excel文件 var strWriter = new StringWriter(); var htmlWriter = new HtmlTextWriter(strWriter); // 設(shè)置編碼和附件格式 Response.ContentType = "application/ms-excel"; Response.ContentEncoding = Encoding.GetEncoding("gb2312"); Response.Charset = "gb2312"; if (!string.IsNullOrEmpty(fileName)) { fileName = HttpUtility.UrlEncode(fileName, Encoding.UTF8);//處理中文名亂碼問(wèn)題 Response.AppendHeader("Content-Disposition", ("attachment;filename=" + (fileName.ToLower().EndsWith(".xls") ? fileName : fileName + ".xls"))); } Response.Flush(); var gvExport = new GridView();// 重新定義一個(gè)無(wú)分頁(yè)的GridView var dt = new DataTable();//這里是要導(dǎo)出的數(shù)據(jù) gvExport.DataSource = dt.DefaultView; gvExport.AllowPaging = false; gvExport.RowDataBound += dgExport_RowDataBound; //優(yōu)化導(dǎo)出數(shù)據(jù)顯示,如身份證、12-1等顯示異常問(wèn)題 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> /// 用來(lái)優(yōu)化導(dǎo)出數(shù)據(jù)顯示 /// </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:@"); } }
總結(jié):
1、方法調(diào)用時(shí)總會(huì)報(bào)錯(cuò):Server cannot set content type after HTTP headers have been sent.
原因:在 Response.AppendHeader 方法調(diào)用之前,先調(diào)用了Response.Flush()方法。
2、報(bào)錯(cuò):必須放在具有 runat=server 的窗體標(biāo)記內(nèi).
解決辦法:public override void VerifyRenderingInServerForm(Control control){} //不需要添加內(nèi)容
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注