asp.netDataTable导出excel方法-我的总结

先来写一段代码,这段代码也是我在网上找的,但是他那个原先有点问题,我对他那个进行了修改,现在这个代码是我修改改过的,应该没有问题的。

 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("&nbsp;", "");
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         }

 下面来写写通过这次导出我的总结。

首先我是第一次做jqueryUI中datagrid导出成excel,而且对Jquery和asp.net都不太熟,完全是个小白,所以我把我遇到的问题在这下面列举一下:

1.当时很奇怪导出excel文件最后为什么用的是response,而且他拼接的代码类似html(其实现在也不懂,哈哈),不过后来终于通窍了一点,感觉这和excel底层的编码有关,据说excel和html的编码是通用的,但是后来一个特别棘手的问题出现了,那就是怎么让前台的html页面下载。一开始我用的是ajax提交表格,但后来怎么点击按钮都没有反应,查了半天才知道,ajax只能返回text,html等文本形式,而在上面代码第63行已经把返回的值改成了下载文件,所以ajax不能用了。后来又查到window.Location,这个很简单,只要在原来html页的方法里加上window.Localtion=“你的url”就可以了,但另一个问题出现了,点击完按钮之后我的整个页面都处于加载状态,并不是我想要的结果。后来,也就是最终的方法,也就是用a标签,可以完美解决!点击完后出现下载,下载完以后,页面是原样的,不会出现正在加载!

2.这个问题是a标签href的传值问题,这里必须要说一下我做这个功能的思路,是在后台把前台调用的查询方法在调用一次,根据B层返回的datatable转换成excel,所以在查询时要传递参数,但如果直接在a标签中href传值提交的话是不行的,这时我用了a标签的onclick方法,先把href初始值设成Javascript(0)(好像是这样写,我也忘了)让它无路径,再添加onclik方法,在方法中取得各标签的值,然后再设置a标签的href,这个问题也解决了。

这个方法自己在网上查,修改,解决自己遇到的问题用了一天半的时间,而且自己觉得自己的方法也很麻烦,但是这个是我现在的学习能力能想到的最好的方案了,自己还有很多知识不足,有些最基础的jquery写法我都得在网上查才能写出来,不过我会努力的,努力提高自己的知识技能。把这作为自己的第一篇总结,也想和大家分享这种方法,虽然麻烦,但最终功能还是完成了,自己也要多储备知识,多多练习,在这里与大家共勉。

 

你可能感兴趣的:(asp.netDataTable导出excel方法-我的总结)