目前见过这么几种类型的导出Excel表:
1,NPIO方式,高仿Java.功能比较强大,但是比较重。
2, 前辈封装的。。。。
3,本文要说的。。
这周五又要导个Excel表,,上面估计是觉得平台封装的导出比较重吧,要我用response方式导出excel表,一个字,没用过。还好上过百度大学~
/// <summary> /// 获取表的标头 /// </summary> /// <param name="caption">The caption.</param> /// <returns>System.String.</returns> /// <remarks>Editor:v-liuhch CreateTime:2015/5/30 19:44:44</remarks> private string GetHeaderName(string caption) { string headName = string.Empty; switch (caption) { case "SerialNo": headName = "SN码"; break; case "PrizeName": headName = "奖品名称"; break; case "TelPhone": headName = "领取电话 "; break; case "NickName": headName = "姓名"; break; case "AwardingTime": headName = "领取时间"; break; case "OkPrizeTime": headName = "抽中时间"; break; default: headName = " "; break; } return headName; }
上面一段是获取列标题的。
接着是导出的过程:
private void ExportSN(HttpContext context) { string accode = context.Request.QueryString["accode"]; HttpResponse response = context.Response; string fileName = "SN码导出表-" + DateTime.Now.ToShortDateString(); excelHeader = string.Empty; excelContent = string.Empty; DataTable dt = PrizeAdapter.Instance.SnManagerData(accode);//获取数据源 DataRow[] dr = dt.Select(); int colCount = dt.Columns.Count; string headName = string.Empty; //行标题 for (int i = 0; i < colCount; i++) { headName = GetHeaderName(dt.Columns[i].Caption); if (i == colCount - 1) { excelHeader += headName + "\n"; } else { excelHeader += headName + "\t"; } } //行数据 foreach (DataRow row in dt.Rows) { for (int i = 0; i < colCount; i++) { if (i == colCount - 1) { excelContent += row[i].ToString() + "\n"; } else { excelContent += row[i].ToString() + "\t"; } } } // ExportGotPrizeSn(context); response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312"); response.ContentType = "application/vnd.ms-excel"; response.AppendHeader("Content-Disposition", "attachment; filename=test.xls"); response.Write(excelHeader); response.Write(excelContent); response.Flush(); response.End(); }
这里要注意指定的contenttype.
但是始终有一个历史遗留问题搞不定:
打开导出的Excel表的时候始终提示:
有人说还是代码写的有问题,也有人说是Office的问题。。。。
跪求路过大神指点~~~~~~··