欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#实现GridView导出Excel实例代码

程序员文章站 2023-11-25 15:55:40
导出excel在很多项目中经常用到,本人介绍了c#实现gridview导出excel实例代码,也全当给自己留下个学习笔记了。 using system.dat...

导出excel在很多项目中经常用到,本人介绍了c#实现gridview导出excel实例代码,也全当给自己留下个学习笔记了。

using system.data;
using system.web;
using system.web.ui;
using system.web.ui.webcontrols;
using system.io;
using system.text;

namespace dotnet.utilities
{
 /// <summary>
 /// summary description for gridviewexport
 /// </summary>
 public class gridviewexport
 {
  public gridviewexport()
  {
   //
   // todo: add constructor logic here
   //
  }

  public static void export(string filename, gridview gv)
  {
   httpcontext.current.response.clear();
   httpcontext.current.response.addheader(
    "content-disposition", string.format("attachment; filename={0}", filename));
   httpcontext.current.response.contenttype = "application/ms-excel";
   //httpcontext.current.response.charset = "utf-8";


   using (stringwriter sw = new stringwriter())
   {
    using (htmltextwriter htw = new htmltextwriter(sw))
    {
     // create a form to contain the grid
     table table = new table();
     table.gridlines = gridlines.both; //单元格之间添加实线

     // add the header row to the table
     if (gv.headerrow != null)
     {
      preparecontrolforexport(gv.headerrow);
      table.rows.add(gv.headerrow);
     }

     // add each of the data rows to the table
     foreach (gridviewrow row in gv.rows)
     {
      preparecontrolforexport(row);
      table.rows.add(row);
     }

     // add the footer row to the table
     if (gv.footerrow != null)
     {
      preparecontrolforexport(gv.footerrow);
      table.rows.add(gv.footerrow);
     }

     // render the table into the htmlwriter
     table.rendercontrol(htw);

     // render the htmlwriter into the response
     httpcontext.current.response.write(sw.tostring());
     httpcontext.current.response.end();
    }
   }
  }

  /// <summary>
  /// replace any of the contained controls with literals
  /// </summary>
  /// <param name="control"></param>
  private static void preparecontrolforexport(control control)
  {
   for (int i = 0; i < control.controls.count; i++)
   {
    control current = control.controls[i];
    if (current is linkbutton)
    {
     control.controls.remove(current);
     control.controls.addat(i, new literalcontrol((current as linkbutton).text));
    }
    else if (current is imagebutton)
    {
     control.controls.remove(current);
     control.controls.addat(i, new literalcontrol((current as imagebutton).alternatetext));
    }
    else if (current is hyperlink)
    {
     control.controls.remove(current);
     control.controls.addat(i, new literalcontrol((current as hyperlink).text));
    }
    else if (current is dropdownlist)
    {
     control.controls.remove(current);
     control.controls.addat(i, new literalcontrol((current as dropdownlist).selecteditem.text));
    }
    else if (current is checkbox)
    {
     control.controls.remove(current);
     control.controls.addat(i, new literalcontrol((current as checkbox).checked ? "true" : "false"));
    }

    if (current.hascontrols())
    {
     preparecontrolforexport(current);
    }
   }
  }


  /// <summary>
  /// 导出grid的数据(全部)到excel
  /// 字段全部为boundfield类型时可用
  /// 要是字段为templatefield模板型时就取不到数据
  /// </summary>
  /// <param name="grid">grid的id</param>
  /// <param name="dt">数据源</param>
  /// <param name="excelfilename">要导出excel的文件名</param>
  public static void outputexcel(gridview grid, datatable dt, string excelfilename)
  {
   page page = (page)httpcontext.current.handler;
   page.response.clear();
   string filename = system.web.httputility.urlencode(system.text.encoding.utf8.getbytes(excelfilename));
   page.response.addheader("content-disposition", "attachment:filename=" + filename + ".xls");
   page.response.contenttype = "application/vnd.ms-excel";
   page.response.charset = "utf-8";

   stringbuilder s = new stringbuilder();
   s.append("<html><head><title>" + filename + "</title><meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\"></head><body>");

   int count = grid.columns.count;

   s.append("<table border=1>");
   s.appendline("<tr>");
   for (int i = 0; i < count; i++)
   {

    if (grid.columns[i].gettype() == typeof(boundfield))
     s.append("<td>" + grid.columns[i].headertext + "</td>");

    //s.append("<td>" + grid.columns[i].headertext + "</td>");

   }
   s.append("</tr>");

   foreach (datarow dr in dt.rows)
   {
    s.appendline("<tr>");
    for (int n = 0; n < count; n++)
    {
     if (grid.columns[n].visible && grid.columns[n].gettype() == typeof(boundfield))
      s.append("<td>" + dr[((boundfield)grid.columns[n]).datafield].tostring() + "</td>");

    }
    s.appendline("</tr>");
   }

   s.append("</table>");
   s.append("</body></html>");

   page.response.binarywrite(system.text.encoding.getencoding("utf-8").getbytes(s.tostring()));
   page.response.end();
  }

 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。