FineUI 官方论坛

标题: Grid在分页的情况下依然能导出全部数据为Excel [打印本页]

作者: 任文彬    时间: 2013-6-28 09:59
标题: Grid在分页的情况下依然能导出全部数据为Excel
本帖最后由 任文彬 于 2013-6-28 10:02 编辑
  1. public static class GridHelper
  2. {
  3.     public static string FormatAsHtml(Grid grid, DataTable table)
  4.     {
  5.         var sb = new StringBuilder("<table frame='box' border='1'>");
  6.         var fields=GetBoundFields(grid);
  7.         AppendHeaderRow(fields, sb);
  8.         AppendDataRow(fields, table, sb);
  9.         sb.Append("</table>");
  10.         return sb.ToString();
  11.     }

  12.     private static IList<BoundField> GetBoundFields(Grid grid)
  13.     {
  14.         var columns = new List<BoundField>();
  15.         for (int i = 0; i < grid.Columns.Count; ++i)
  16.         {
  17.             var c = grid.Columns[i] as BoundField;
  18.             if (c == null)  //只导出BoundField
  19.                 continue;
  20.             columns.Add(c);
  21.         }
  22.         return columns;
  23.     }

  24.     private static void AppendDataRow(IList<BoundField> fields, DataTable table, StringBuilder sb)
  25.     {
  26.         for (int rowIndex = 0; rowIndex < table.Rows.Count; ++rowIndex)
  27.         {
  28.             sb.Append("<tr>");
  29.             for (int colIndex = 0; colIndex < fields.Count; ++colIndex)
  30.             {
  31.                 AppendDataCell(sb, table.Rows[rowIndex], fields[colIndex].DataField, fields[colIndex].DataFormatString);
  32.             }
  33.             sb.Append("</tr>");
  34.         }
  35.     }


  36.     private static void AppendDataCell(StringBuilder sb, DataRow row, string dataField, string dataFormat)
  37.     {
  38.         if (!row.Table.Columns.Contains(dataField))
  39.         {
  40.             sb.Append("<td></td>");
  41.         }
  42.         else
  43.         {
  44.             var data=row[dataField];
  45.             if (data is Decimal || data is Double || data is Single)
  46.                 sb.Append("<td align='right'>");
  47.             else
  48.                 sb.Append("<td>");
  49.             string cellText = FormatCellText(dataFormat, data);
  50.             sb.Append(cellText);
  51.             sb.Append("</td>");
  52.         }
  53.     }

  54.     private static string FormatCellText(string format, object data)
  55.     {
  56.         string cellText;
  57.         if (data == null || Convert.IsDBNull(data))
  58.             cellText = "";
  59.         else if (string.IsNullOrEmpty(format))
  60.             cellText = data.ToString();
  61.         else
  62.             cellText = string.Format(format, data);
  63.         return cellText;
  64.     }

  65.     private static void AppendHeaderRow(IList<BoundField> fields, StringBuilder sb)
  66.     {
  67.         sb.Append("<tr style='font-weight:bold; text-align:center'>");
  68.         for (int i = 0; i < fields.Count; ++i)
  69.         {
  70.             var col = fields[i];
  71.             sb.Append("<td>").Append(col.HeaderText).Append("</td>");
  72.         }
  73.         sb.Append("</tr>");
  74.     }
  75. }
复制代码

作者: 冬天    时间: 2013-6-28 12:46
都是高手啊。
作者: erp8@live.cn    时间: 2013-7-4 18:32
谢谢分享,正需要
作者: erp8@live.cn    时间: 2013-7-4 19:00
是新建一个类是吧?
请问有调用方法示例吗?
--我是初学者
作者: erp8@live.cn    时间: 2013-7-5 11:46
Grid在分页的情况下依然能导出全部数据为Excel
终于可以了,
--昨天折腾了一晚!
衷心的感谢:作者:任文彬
还有群友:angrySperm(UID:3175)(352290642) 和UID:4046(569251516) 11:05:29

作者: yygy    时间: 2013-7-5 12:02
能共享一下
作者: 孤独的过客    时间: 2013-7-5 12:30
不错,经常会用到
作者: fat    时间: 2013-8-19 00:01
有下载的吗
作者: 世界没有真情    时间: 2013-8-19 12:24
请问下,上面的代码不是只是返回一个html字符串吗?html字符串能转换成excel表吗?还有上面的table是哪里来的数据?是用什么保存下来的?如果是再查询一次的话,直接用插件导出不就行了?
作者: erp8@live.cn    时间: 2013-8-19 20:00
根据你自定义的TABLE条件直接导出为EXCEL文件
作者: delphi9    时间: 2013-8-20 18:47
本帖最后由 delphi9 于 2013-8-20 18:50 编辑

怎么用的?楼上能给个例子?我是初学者:)
这个貌似生成了一个<table>,怎么把生成table另存为excel?

作者: 除了时间    时间: 2013-9-24 09:03
不孬,学习了,感谢楼主

建个GridHelper类,导出时,调用FormatAsHtml()此方法就行了。

Response.ClearContent();
Response.AddHeader("content-disposition", "attachment; filename=MyExcelFile.xls");
Response.ContentType = "application/excel";
Response.Write(FormatAsHtml(Grid1,Table));
Response.End();
作者: 甘桂    时间: 2013-12-11 11:48
数据源单独一个 private void  BindGrid()。在导出事件中,再调用一次数据绑定。这样的绑定是不分页的。这是取简单的方法。




欢迎光临 FineUI 官方论坛 (https://fineui.com/bbs/) Powered by Discuz! X3.4