先来写一段代码,这段代码也是我在网上找的,可是他那个原先有点问题,我对他那个进行了修改,如今这个代码是我修改改过的,应该没有问题的。html
1 public int StreamExport(System.Data.DataTable dt, List<string> ColNames, string fileName) 2 { 3 4 if (string.IsNullOrEmpty(fileName)) return 0; 5 6 StringBuilder content = new StringBuilder(); 7 StringBuilder strtitle = new StringBuilder(); 8 content.Append("<html xmlns:o='urn:schemas-microsoft-com:office:office' xmlns:x='urn:schemas-microsoft-com:office:excel' xmlns='http://www.w3.org/TR/REC-html40'>"); 9 content.Append("<head><title></title><meta http-equiv='Content-Type' content=\"text/html; charset=gb2312\">"); 10 //注意:[if gte mso 9]到[endif]之间的代码,用于显示Excel的网格线,若不想显示Excel的网格线,能够去掉此代码 11 content.Append("<!--[if gte mso 9]>"); 12 content.Append("<xml>"); 13 content.Append(" <x:ExcelWorkbook>"); 14 content.Append(" <x:ExcelWorksheets>"); 15 content.Append(" <x:ExcelWorksheet>"); 16 content.Append(" <x:Name>Sheet1</x:Name>"); 17 content.Append(" <x:WorksheetOptions>"); 18 content.Append(" <x:Print>"); 19 content.Append(" <x:ValidPrinterInfo />"); 20 content.Append(" </x:Print>"); 21 content.Append(" </x:WorksheetOptions>"); 22 content.Append(" </x:ExcelWorksheet>"); 23 content.Append(" </x:ExcelWorksheets>"); 24 content.Append("</x:ExcelWorkbook>"); 25 content.Append("</xml>"); 26 content.Append("<![endif]-->"); 27 content.Append("</head><body><table style='border-collapse:collapse;table-layout:fixed;'><tr>"); 28 for (int i = 0; i < ColNames.Count; i++) 29 { 30 31 content.Append("<td><b>" + ColNames[i] + "</b></td>"); 32 } 33 content.Append("</tr>\n"); 34 35 for (int j = 0; j < dt.Rows.Count; j++) 36 { 37 content.Append("<tr>"); 38 for (int k = 0; k < dt.Columns.Count; k++) 39 { 40 object obj = dt.Rows[j][k]; 41 Type type = obj.GetType(); 42 if (type.Name == "Int32" || type.Name == "Single" || type.Name == "Double" || type.Name == "Decimal") 43 { 44 double d = obj == DBNull.Value ? 0.0d : Convert.ToDouble(obj); 45 if (type.Name == "Int32" || (d - Math.Truncate(d) == 0)) 46 content.AppendFormat("<td style='vnd.ms-excel.numberformat:#,##0'>{0}</td>", obj); 47 else 48 content.AppendFormat("<td style='vnd.ms-excel.numberformat:#,##0.00'>{0}</td>", obj); 49 } 50 else 51 content.AppendFormat("<td style='vnd.ms-excel.numberformat:@'>{0}</td>", obj); 52 } 53 content.Append("</tr>\n"); 54 } 55 content.Append("</table></body></html>"); 56 content.Replace(" ", ""); 57 Response.Clear(); 58 Response.Buffer = true; 59 Response.ContentType = "application/vnd.ms-excel"; //"application/ms-excel"; 60 Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312"); 61 Response.Charset = "gb2312"; 62 fileName = System.Web.HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8); 63 Response.AppendHeader("Content-Disposition", "attachment; filename=" + fileName); 64 Response.Write(content.ToString()); 65 Response.Output.Flush(); 66 //pages.Response.End(); //注意,若使用此代码结束响应可能会出现“因为代码已通过优化或者本机框架位于调用堆栈之上,没法计算表达式的值。”的异常。 67 HttpContext.Current.ApplicationInstance.CompleteRequest(); //用此行代码代替上一行代码,则不会出现上面所说的异常。 68 return 1; 69 }
下面来写写经过此次导出个人总结。ajax
首先我是第一次作将datatable导出成excel,并且对Jquery和asp.net都不太熟,彻底是个小白,在这个过程当中遇到不少问题,解决也花了很长一段时间。在这里作个总结,给跟我同样的小白点参考。app
(先说个题外话,一开始不是很懂的人看这段代码可能会很奇怪拼接excel的格式为何很相似html的语法,我也纳闷,百度了一下发现原来html和excel的编码是同样的,后来去作别的系统的excel导出时发现同事用了拼接table的方法去组成excel也证实了这一点,并且table的格式在excel中也是通用的。)框架
1.导出的excel怎样传回html页让他下载?asp.net
一开始我用的是ajax提交表格,但后来怎么点击按钮都没有反应,查了半天才知道,ajax只能返回的数据只能是文本形式,而在上面代码第63行也就是学习
Response.AppendHeader("Content-Disposition", "attachment; filename=" + fileName);
已经把返回的值改为了下载文件,因此ajax不能用了。后来又查到window.Location,这个很简单,只要在原来html页的方法里加上window.Localtion=“你的url”就能够了,但另外一个问题出现了,点击完按钮以后个人整个页面都处于加载状态,并非我想要的结果。后来问了同事才知道,原来直接用a标签就能够解决怪本身以为这个过高大上了a标签应该不行,结果用了那么多复杂的方法都没成,没想到最简单的却解决了问题。优化
2.如何在a标签传递参数?ui
由于导出的excel要和根据不一样条件查询出来结果一致的,因此传入的参数不是固定的,那么a标签的herf就不能在一开始就写好了,采用a标签的onclick方法,先把href初始值设成Javascript(0)(好像是这样写,我也忘了)让它无路径,再在方法中取得各标签的值,而后再设置a标签的href,这个问题就解决了。编码
如今回想起来这些问题真的挺简单的,但刚作的时候真的是耗费了很多时间,尤为是本身在学校中历来没接触过这些,不过作出来看到本身的代码实现了各类功能真的仍是挺开心的!须要学习的地方太多了,要不断学习,不断进步!url