将DataGrid中的数据导出为Excel的方法

  1. Utils.cs 文件内容:
  2. using System;
  3. using System.Data;
  4. using System.Configuration;
  5. using System.Web;
  6. using System.Web.Security;
  7. using System.Web.UI;
  8. using System.Web.UI.WebControls;
  9. using System.Web.UI.WebControls.WebParts;
  10. using System.Web.UI.HtmlControls;
  11. using OnlineCard.Comm.AdminComm.Lib;
  12. namespace OCAdminUI
  13. {
  14.     public delegate string ReplaceColumnValueHandler(object value);
  15.     public class DataTableUtil
  16.     {
  17.         /// <summary>
  18.         /// 剔除无用的列, 并根据传入的列名顺序重新排列
  19.         /// </summary>
  20.         /// <param name="visibleCols">需要显示的列(列名之间用,号割开,如:"Id,Name,Email")</param>
  21.         /// <param name="dt">要进行修饰的 DataTable</param>
  22.         /// <returns></returns>
  23.         public static DataTable RejectColumn(string[] visibleCols, DataTable dt)
  24.         {
  25.             DataView dv = new DataView(dt);
  26.             DataTable outTable = dv.ToTable(dt.TableName, false, visibleCols);
  27.             return outTable;
  28.         }
  29.         /// <summary>
  30.         /// 替换列名(列名不区分大小些)
  31.         /// </summary>
  32.         /// <param name="dt"></param>
  33.         /// <param name="sourceColumnName"></param>
  34.         /// <param name="replaceColumnName"></param>
  35.         public static void ReplaceColumnName(DataTable dt, string sourceColumnName, string replaceColumnName)
  36.         {
  37.             for (int i = 0; i < dt.Columns.Count; i++)
  38.             {
  39.                 if (dt.Columns[i].ColumnName.ToLower() == sourceColumnName.ToLower())
  40.                 {
  41.                     dt.Columns[i].ColumnName = replaceColumnName;
  42.                     return;
  43.                 }
  44.             }
  45.         }
  46.         /// <summary>
  47.         /// 替换列的值
  48.         /// </summary>
  49.         /// <param name="dt"></param>
  50.         /// <param name="columnName"></param>
  51.         /// <param name="handler"></param>
  52.         public static void ReplaceEachColumnValue(DataTable dt, string columnName, ReplaceColumnValueHandler handler)
  53.         {
  54.             int index = FindColumnIndex(dt, columnName);
  55.             if (index > -1)
  56.             {
  57.                 dt.Columns[index].DataType = typeof(string);
  58.                 foreach (DataRow row in dt.Rows)
  59.                 {
  60.                     row[index] = handler(row[index].ToString());
  61.                 }
  62.             }
  63.         }
  64.         private static int FindColumnIndex(DataTable dt, string columnName)
  65.         {
  66.             for (int i = 0; i < dt.Columns.Count; i++)
  67.             {
  68.                 if (dt.Columns[i].ColumnName.ToLower() == columnName.ToLower())
  69.                 {
  70.                     return i;
  71.                 }
  72.             }
  73.             return -1;
  74.         }
  75.     }
  76.     public class ExcelUtil
  77.     {
  78.         public static void ExportToExcel(DataGrid dtData, string footString, System.Web.UI.Page page)
  79.         {
  80.             if (dtData != null)
  81.             {
  82.                 if (dtData.Items.Count == 0)
  83.                 {
  84.                     Tools.Alert("当前无数据导出", page);
  85.                     return;
  86.                 }
  87.                 dtData.AllowPaging = false;
  88.                 dtData.AutoGenerateColumns = false;
  89.                 System.Web.HttpResponse httpResponse = page.Response;
  90.                 httpResponse.Clear();
  91.                 httpResponse.Buffer = true;
  92.                 httpResponse.Charset = "gb2312";
  93.                 string fileName = DateTime.Now.ToString("yyyyMMddHHmmssms") + ".xls";
  94.                 httpResponse.AppendHeader("Content-Disposition""attachment;filename=" + HttpUtility.UrlEncode(fileName,
  95.                     System.Text.Encoding.UTF8));
  96.                 httpResponse.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");
  97.                 httpResponse.ContentType = "application/ms-excel";
  98.                 System.IO.StringWriter tw = new System.IO.StringWriter();
  99.                 System.Web.UI.HtmlTextWriter hw = new System.Web.UI.HtmlTextWriter(tw);
  100.                 dtData.RenderControl(hw);
  101.                 hw.Write(footString);
  102.                 string directoryPath = page.Server.MapPath("~/") + "TempExcel";
  103.                 string filePath = page.Server.MapPath("~/") + "TempExcel//" + fileName;
  104.                 if (!System.IO.Directory.Exists(directoryPath))
  105.                 {
  106.                     System.IO.Directory.CreateDirectory(directoryPath);
  107.                 }
  108.                 System.IO.StreamWriter sw = System.IO.File.CreateText(filePath);
  109.                 sw.Write(tw.ToString());
  110.                 sw.Close();
  111.                 DownFile(httpResponse, fileName, filePath);
  112.                 httpResponse.End();
  113.             }
  114.         }
  115.         private static bool DownFile(System.Web.HttpResponse Response, string fileName, string fullPath)
  116.         {
  117.             System.IO.FileStream fs = System.IO.File.OpenRead(fullPath);
  118.             try
  119.             {
  120.                 Response.ContentType = "application/octet-stream";
  121.                 Response.AppendHeader("Content-Disposition""attachment;filename=" +
  122.                 HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8) + ";charset=GB2312");
  123.                 long fLen = fs.Length;
  124.                 int size = 102400;//每100K同时下载数据 
  125.                 byte[] readData = new byte[size];//指定缓冲区的大小 
  126.                 if (size > fLen) size = Convert.ToInt32(fLen);
  127.                 long fPos = 0;
  128.                 bool isEnd = false;
  129.                 while (!isEnd)
  130.                 {
  131.                     if ((fPos + size) > fLen)
  132.                     {
  133.                         size = Convert.ToInt32(fLen - fPos);
  134.                         readData = new byte[size];
  135.                         isEnd = true;
  136.                     }
  137.                     fs.Read(readData, 0, size);//读入一个压缩块
  138.                     if (readData.Length > 0)
  139.                         Response.BinaryWrite(readData);
  140.                     fPos += size;
  141.                 }
  142.                 return true;
  143.             }
  144.             catch
  145.             {
  146.                 return false;
  147.             }
  148.             finally
  149.             {
  150.                 fs.Close();
  151.                 System.IO.File.Delete(fullPath);
  152.             }
  153.         }
  154.     }
  155. }
  156. .CS文件后台调用的方法(解决方案中需在Code文件夹中引用Utils.cs文件)
  157. //导出表格按钮
  158.         protected void btnExportDatas_Click(object sender, EventArgs e)
  159.         {
  160.             if (dgOrderList.Items.Count == 0)
  161.             {
  162.                 Tools.Alert("当前无可导出数据!"this.Page);
  163.             }
  164.             else
  165.             {
  166.                 int totalOrder = 0;
  167.                 //总面值
  168.                 decimal sumFaceMoney = 0M;
  169.                 //总金额
  170.                 decimal sumRealMoney = 0M;
  171.                 try
  172.                 {
  173.                     DataSet ds = ChargeOrderService.GetChargeOrdersSumData(false, queryCondition(), this.pager.RecordCount, 1,
  174.                         out totalOrder, trueout sumFaceMoney, out sumRealMoney);
  175.                     string usedColumnString = "OrderId,CreatedDate,CardNumber,FaceMoney,RequestMoney,RealCZMoney,Status,CsLoginId";
  176.                    
  177.                     DataTable dt = DataTableUtil.RejectColumn(usedColumnString.Split(','), ds.Tables[0]);
  178.                     DataTableUtil.ReplaceColumnName(dt, "OrderId""充值订单号");                    
  179.                     DataTableUtil.ReplaceColumnName(dt, "CreatedDate","时间");
  180.                     DataTableUtil.ReplaceColumnName(dt, "CardNumber""卡号");                      
  181.                     DataTableUtil.ReplaceColumnName(dt, "FaceMoney""面额");
  182.                     DataTableUtil.ReplaceColumnName(dt, "RequestMoney""申请金额");
  183.                     DataTableUtil.ReplaceColumnName(dt, "RealCZMoney""实际金额");
  184.                     DataTableUtil.ReplaceColumnName(dt, "Status""状态");
  185.                     DataTableUtil.ReplaceColumnName(dt, "CsLoginId""操作客服");
  186.                     string footString = string.Format("总面值:{0}  总金额:{1}", sumFaceMoney, sumRealMoney);
  187.                     DataGrid dtData = new DataGrid();
  188.                     dtData.ItemDataBound += new DataGridItemEventHandler(dtData_ItemDataBound);
  189.                     dtData.DataSource = dt;
  190.                     dtData.DataBind();
  191.                     ExcelUtil.ExportToExcel(dtData, footString, this);
  192.                 }
  193.                 catch (Exception ex)
  194.                 {
  195.                     Tools.Alert(ex.Message, this.Page);
  196.                     return;
  197.                 }
  198.             }
  199.         }
  200.         void dtData_ItemDataBound(object sender, DataGridItemEventArgs e)
  201.         {
  202.             if (e.Item.ItemType == ListItemType.Item ||
  203.                 e.Item.ItemType == ListItemType.AlternatingItem)
  204.             {
  205.                 //在此将显示的值中加入单引号,目的是excel只显示15位的数值,如果显示18位的话excel只显示15位正确的后面是用0代替的,所以需要转换
  206.                 e.Item.Cells[2].Attributes.Add("style""vnd.ms-excel.numberformat:@");
  207.                 e.Item.Cells[6].Text = GetCZOrderStatus(e.Item.Cells[6].Text);
  208.             }
  209.         }
  210.         private string GetCZOrderStatus(string value)
  211.         {
  212.             CZOrderSatus status = (CZOrderSatus)(int.Parse(value));
  213.             switch (status)
  214.             {
  215.                 case CZOrderSatus.Initial:
  216.                     return "初始";
  217.                 case CZOrderSatus.CheckOut:
  218.                     return "签出";
  219.                 case CZOrderSatus.Success:
  220.                     return "成功";                
  221.                 case CZOrderSatus.Failure:
  222.                     return "失败";
  223.                 case CZOrderSatus.CheckIn:
  224.                     return "签入";
  225.                 case CZOrderSatus.Finished:
  226.                     return "结束";
  227.                 default:
  228.                     return "_未知_";
  229.             }             
  230.         }
  231.     }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值