• asp.netDataTable导出excel方法(1)


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

     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>
    ");
    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>
    ");
    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         }

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

    首先我是第一次做将datatable导出成excel,而且对Jquery和asp.net都不太熟,完全是个小白,在这个过程中遇到很多问题,解决也花了很长一段时间。在这里做个总结,给跟我一样的小白点参考。

    (先说个题外话,一开始不是很懂的人看这段代码可能会很奇怪拼接excel的格式为什么很类似html的语法,我也纳闷,百度了一下发现原来html和excel的编码是一样的,后来去做别的系统的excel导出时发现同事用了拼接table的方法去组成excel也证明了这一点,而且table的格式在excel中也是通用的。)

    1.导出的excel怎样传回html页让他下载?

    一开始我用的是ajax提交表格,但后来怎么点击按钮都没有反应,查了半天才知道,ajax只能返回的数据只能是文本形式,而在上面代码第63行也就是

    Response.AppendHeader("Content-Disposition", "attachment; filename=" + fileName);

    已经把返回的值改成了下载文件,所以ajax不能用了。后来又查到window.Location,这个很简单,只要在原来html页的方法里加上window.Localtion=“你的url”就可以了,但另一个问题出现了,点击完按钮之后我的整个页面都处于加载状态,并不是我想要的结果。后来问了同事才知道,原来直接用a标签就可以解决怪自己觉得这个太高大上了a标签应该不行,结果用了那么多复杂的方法都没成,没想到最简单的却解决了问题。

    2.如何在a标签传递参数?

    因为导出的excel要和根据不同条件查询出来结果一致的,所以传入的参数不是固定的,那么a标签的herf就不能在一开始就写好了,采用a标签的onclick方法,先把href初始值设成Javascript(0)(好像是这样写,我也忘了)让它无路径,再在方法中取得各标签的值,然后再设置a标签的href,这个问题就解决了。

    现在回想起来这些问题真的挺简单的,但刚做的时候真的是耗费了不少时间,尤其是自己在学校中从来没接触过这些,不过做出来看到自己的代码实现了各种功能真的还是挺开心的!需要学习的地方太多了,要不断学习,不断进步!

  • 相关阅读:
    Spring
    华为OJ题目:扑克牌大小
    冒泡排序算法总结
    华为OJ题目:刷题
    求立方根
    假硬币问题求解
    SQL in Qt (一)
    Qt3D教程
    (Qt 翻译) QGLAbstractScene
    (Qt 翻译) QGLSceneNode
  • 原文地址:https://www.cnblogs.com/junshijie/p/5085384.html
Copyright © 2020-2023  润新知