zoukankan      html  css  js  c++  java
  • 将 GridView 中的内容导出到 Excel 中多个工作表(Sheet) 的方法

    Excel 可以保存成 xml 格式,并且支持Sheet功能,因此,我们就可以利用这个功能将 Gridview 导出到多个 Sheet  中去。而且可以很好地控制导出的格式。下面就是完整的代码(注意:本站的代码都是可以直接复制、保存成aspx文件运行的。):

    例子

    ASPX 代码
    <%@ Page Language="C#" EnableViewState="true" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <script runat="server">

      protected
    void Page_Load(object sender, EventArgs e)
      {
        
    if (!Page.IsPostBack)
        {
          System.Data.DataTable dt
    = new System.Data.DataTable();
          System.Data.DataRow dr;
          dt.Columns.Add(
    new System.Data.DataColumn("学生班级", typeof(System.String)));
          dt.Columns.Add(
    new System.Data.DataColumn("学生姓名", typeof(System.String)));
          dt.Columns.Add(
    new System.Data.DataColumn("语文", typeof(System.Decimal)));
          dt.Columns.Add(
    new System.Data.DataColumn("数学", typeof(System.Decimal)));
          dt.Columns.Add(
    new System.Data.DataColumn("英语", typeof(System.Decimal)));
          dt.Columns.Add(
    new System.Data.DataColumn("计算机", typeof(System.Decimal)));
          System.Random rd
    = new System.Random();
          
    for (int i = 0; i < 88; i++)
          {
            dr
    = dt.NewRow();
            dr[
    0] = "班级" + i.ToString();
            dr[
    1] = "【孟子E章】" + i.ToString();
            dr[
    2] = System.Math.Round(rd.NextDouble() * 100, 0);
            dr[
    3] = System.Math.Round(rd.NextDouble() * 100, 0);
            dr[
    4] = System.Math.Round(rd.NextDouble() * 100, 0);
            dr[
    5] = System.Math.Round(rd.NextDouble() * 100, 0);
            dt.Rows.Add(dr);
          }
          GridView1.DataSource
    = dt;
          GridView1.DataBind();
        }
      }

      protected
    void Button1_Click(object sender, EventArgs e)
      {
        
    //假如每10条数据放在一个 Sheet 里面,先计算需要多少个 Sheet
        int ItenCountPerSheet = 10;
        
    int SheetCount = Convert.ToInt32(Math.Ceiling((double)GridView1.Rows.Count / ItenCountPerSheet));

        String ExportFileName = "孟宪会Excel表格测试";
        if (Request.Browser.Browser.IndexOf("MSIE") > -1)
        {
          ExportFileName = Server.UrlEncode(ExportFileName);
        }
        Response.ClearContent();
        Response.BufferOutput = true;
        Response.Charset = "utf-8";
        Response.ContentType = "text/xml";
        Response.ContentEncoding = System.Text.Encoding.UTF8;
        Response.AppendHeader("Content-Disposition", "attachment;filename=" + ExportFileName + ".xls");
        // 采用下面的格式,将兼容 Excel 2003,Excel 2007, Excel 2010。
        //
    Response.AppendHeader("Content-Disposition", "attachment;filename="+Server.UrlEncode("孟宪会Excel表格测试")+".xml");
        Response.Write(
    "<?xml version='1.0'?><?mso-application progid='Excel.Sheet'?>");
        Response.Write(@
    "\r\n<Workbook xmlns='urn:schemas-microsoft-com:office:spreadsheet'
          xmlns:o='urn:schemas-microsoft-com:office:office' xmlns:x='urn:schemas-microsoft-com:office:excel'
          xmlns:ss='urn:schemas-microsoft-com:office:spreadsheet' xmlns:html='http://www.w3.org/TR/REC-html40'>
    ");
        Response.Write(@
    "\r\n<DocumentProperties xmlns='urn:schemas-microsoft-com:office:office'>");
        Response.Write(@
    "\r\n<Author>孟宪会</Author><LastAuthor>孟子E章</LastAuthor>
              <Created>2010-09-08T14:07:11Z</Created><Company>mxh</Company><Version>1990</Version>
    ");
        Response.Write(
    "\r\n</DocumentProperties>");
        Response.Write(@
    "\r\n<Styles><Style ss:ID='Default' ss:Name='Normal'><Alignment ss:Vertical='Center'/>
          <Borders/><Font ss:FontName='宋体' x:CharSet='134' ss:Size='12'/><Interior/><NumberFormat/><Protection/></Style>
    ");
        
    //定义标题样式    
        Response.Write(@"<Style ss:ID='Header'><Borders><Border ss:Position='Bottom' ss:LineStyle='Continuous' ss:Weight='1'/>
           <Border ss:Position='Left' ss:LineStyle='Continuous' ss:Weight='1'/>
           <Border ss:Position='Right' ss:LineStyle='Continuous' ss:Weight='1'/>
           <Border ss:Position='Top' ss:LineStyle='Continuous' ss:Weight='1'/></Borders>
           <Font ss:FontName='宋体' x:CharSet='134' ss:Size='18' ss:Color='#FF0000' ss:Bold='1'/></Style>
    ");
        
        
    //定义边框
        Response.Write(@"<Style ss:ID='border'><NumberFormat ss:Format='@'/><Borders>
          <Border ss:Position='Bottom' ss:LineStyle='Continuous' ss:Weight='1'/>
          <Border ss:Position='Left' ss:LineStyle='Continuous' ss:Weight='1'/>
          <Border ss:Position='Right' ss:LineStyle='Continuous' ss:Weight='1'/>
          <Border ss:Position='Top' ss:LineStyle='Continuous' ss:Weight='1'/></Borders></Style>
    ");
          
        Response.Write(
    "</Styles>");


        
    for (int i = 0; i < SheetCount; i++)
        {
          
    //计算该 Sheet 中的数据起始行和结束行。
          int start = ItenCountPerSheet * i;
          
    int end = ItenCountPerSheet * (i + 1);
          
    if (end > GridView1.Rows.Count) end = GridView1.Rows.Count;
        
          Response.Write(
    "\r\n<Worksheet ss:Name='Sheet" + (i+1) + "'>");
          Response.Write(
    "\r\n<Table x:FullColumns='1' x:FullRows='1'>");
          
    //输出标题

          Response.Write(
    "\r\n<Row ss:AutoFitHeight='1'>");
            
    for (int j = 0; j < GridView1.HeaderRow.Cells.Count; j++)
            {
              Response.Write(
    "<Cell ss:StyleID='Header'><Data ss:Type='String'>" + GridView1.HeaderRow.Cells[j].Text + "</Data></Cell>");
            }
              Response.Write(
    "\r\n</Row>");

          
    for (int j = start; j < end; j++)
            {
              Response.Write(
    "\r\n<Row>");
              
    for (int c = 0; c < GridView1.HeaderRow.Cells.Count; c++)
              {
                
    //对于数字,采用Number数字类型
                if (c > 1)
                {
                  Response.Write(
    "<Cell ss:StyleID='border'><Data ss:Type='Number'>" + GridView1.Rows[j].Cells[c].Text + "</Data></Cell>");
                }
                
    else
                {
                  Response.Write(
    "<Cell ss:StyleID='border'><Data ss:Type='String'>" + GridView1.Rows[j].Cells[c].Text + "</Data></Cell>");
                }
              }
                Response.Write(
    "\r\n</Row>");
            }
          Response.Write(
    "\r\n</Table>");
          Response.Write(
    "\r\n</Worksheet>");
          Response.Flush();
        }
        Response.Write(
    "\r\n</Workbook>");
        Response.End();
      }

    </script>

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
      
    <title></title>
    </head>
    <body>
      
    <form id="form1" runat="server">
      
    <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="导出测试" />
      
    <asp:GridView ID="GridView1" runat="server">
      
    </asp:GridView>
      
    </form>
    </body>
    </html>

    另外,请注意:代码里面添加了\r\n换行,是为了生成出来的xml格式有换行,实际可以不用。

    如果是DataTable,DataSet,可以直接导出成文件。下面是完整的源代码:

    C# 代码
    <%@ Page Language="C#" %>

    <script runat="server">

      
    protected void Page_Load(object sender, EventArgs e)
      {
        
    // 下面采用的是DataTable,也可以采用DataSet,其中每个DataTable可以保存成一个 Sheet
        
    // 迅雷下载时可以在下载完毕后会自动把文件名更新成 xls 或者 xml 的。
        System.Data.DataTable dt = new System.Data.DataTable();
        
    if (!Page.IsPostBack)
        {
          System.Data.DataRow dr;
          dt.Columns.Add(
    new System.Data.DataColumn("学生班级", typeof(System.String)));
          dt.Columns.Add(
    new System.Data.DataColumn("学生姓名", typeof(System.String)));
          dt.Columns.Add(
    new System.Data.DataColumn("语文", typeof(System.Decimal)));
          dt.Columns.Add(
    new System.Data.DataColumn("数学", typeof(System.Decimal)));
          dt.Columns.Add(
    new System.Data.DataColumn("英语", typeof(System.Decimal)));
          dt.Columns.Add(
    new System.Data.DataColumn("计算机", typeof(System.Decimal)));
          System.Random rd
    = new System.Random();
          
    for (int i = 0; i < 88; i++)
          {
            dr
    = dt.NewRow();
            dr[
    0] = "班级" + i.ToString();
            dr[
    1] = "【孟子E章】" + i.ToString();
            dr[
    2] = System.Math.Round(rd.NextDouble() * 100, 0);
            dr[
    3] = System.Math.Round(rd.NextDouble() * 100, 0);
            dr[
    4] = System.Math.Round(rd.NextDouble() * 100, 0);
            dr[
    5] = System.Math.Round(rd.NextDouble() * 100, 0);
            dt.Rows.Add(dr);
          }
        }

        
    //假如每10条数据放在一个 Sheet 里面,先计算需要多少个 Sheet
        int ItenCountPerSheet = 10;
        
    int SheetCount = Convert.ToInt32(Math.Ceiling((double)dt.Rows.Count / ItenCountPerSheet));
        Response.ClearContent();
        Response.BufferOutput
    = true;
        Response.Charset
    = "utf-8";
        Response.ContentType
    = "application/ms-excel";
        Response.AddHeader(
    "Content-Transfer-Encoding", "binary");
        Response.ContentEncoding
    = System.Text.Encoding.UTF8;
        
    //Response.AppendHeader("Content-Disposition", "attachment;filename="+Server.UrlEncode("孟宪会Excel表格测试")+".xls");
        
    // 采用下面的格式,将兼容 Excel 2003,Excel 2007, Excel 2010。

        String FileName
    = "孟宪会Excel表格测试";
        
    if (!String.IsNullOrEmpty(Request.UserAgent))
        {
          
    // firefox 里面文件名无需编码。
          if (!(Request.UserAgent.IndexOf("Firefox") > -1 && Request.UserAgent.IndexOf("Gecko") > -1))
          {
            FileName
    = Server.UrlEncode(FileName);
          }
        }
        Response.AppendHeader(
    "Content-Disposition", "attachment;filename=" + FileName + ".xml");
        Response.Write(
    "<?xml version='1.0'?><?mso-application progid='Excel.Sheet'?>");
        Response.Write(
    @"<Workbook xmlns='urn:schemas-microsoft-com:office:spreadsheet'
          xmlns:o='urn:schemas-microsoft-com:office:office' xmlns:x='urn:schemas-microsoft-com:office:excel'
          xmlns:ss='urn:schemas-microsoft-com:office:spreadsheet' xmlns:html='http://www.w3.org/TR/REC-html40'>
    ");
        Response.Write(
    @"<DocumentProperties xmlns='urn:schemas-microsoft-com:office:office'>");
        Response.Write(
    @"<Author>孟宪会</Author><LastAuthor>孟子E章</LastAuthor>
              <Created>2010-09-08T14:07:11Z</Created><Company>mxh</Company><Version>1990</Version>
    ");
        Response.Write(
    "</DocumentProperties>");
        Response.Write(
    @"<Styles><Style ss:ID='Default' ss:Name='Normal'><Alignment ss:Vertical='Center'/>
          <Borders/><Font ss:FontName='宋体' x:CharSet='134' ss:Size='12'/><Interior/><NumberFormat/><Protection/></Style>
    ");
        
    //定义标题样式    
        Response.Write(@"<Style ss:ID='Header'><Borders><Border ss:Position='Bottom' ss:LineStyle='Continuous' ss:Weight='1'/>
           <Border ss:Position='Left' ss:LineStyle='Continuous' ss:Weight='1'/>
           <Border ss:Position='Right' ss:LineStyle='Continuous' ss:Weight='1'/>
           <Border ss:Position='Top' ss:LineStyle='Continuous' ss:Weight='1'/></Borders>
           <Font ss:FontName='宋体' x:CharSet='134' ss:Size='18' ss:Color='#FF0000' ss:Bold='1'/></Style>
    ");

        
    //定义边框
        Response.Write(@"<Style ss:ID='border'><NumberFormat ss:Format='@'/><Borders>
          <Border ss:Position='Bottom' ss:LineStyle='Continuous' ss:Weight='1'/>
          <Border ss:Position='Left' ss:LineStyle='Continuous' ss:Weight='1'/>
          <Border ss:Position='Right' ss:LineStyle='Continuous' ss:Weight='1'/>
          <Border ss:Position='Top' ss:LineStyle='Continuous' ss:Weight='1'/></Borders></Style>
    ");

        Response.Write(
    "</Styles>");

        
    //SheetCount代表生成的 Sheet 数目。
        for (int i = 0; i < SheetCount; i++)
        {
          
    //计算该 Sheet 中的数据起始行和结束行。
          int start = ItenCountPerSheet * i;
          
    int end = ItenCountPerSheet * (i + 1);
          
    if (end > dt.Rows.Count) end = dt.Rows.Count;

          Response.Write(
    "<Worksheet ss:Name='Sheet" + (i + 1) + "'>");
          Response.Write(
    "<Table x:FullColumns='1' x:FullRows='1'>");

          
    //输出标题
          Response.Write("\r\n<Row ss:AutoFitHeight='1'>");
          
    for (int j = 0; j < dt.Columns.Count; j++)
          {
            Response.Write(
    "<Cell ss:StyleID='Header'><Data ss:Type='String'>" + dt.Columns[j].ColumnName + "</Data></Cell>");
          }
          Response.Write(
    "\r\n</Row>");
          

          
    for (int j = start; j < end; j++)
          {
            Response.Write(
    "<Row>");
            
    for (int c = 0; c < 6; c++)
            {
              
    //对于数字,采用Number数字类型
              if (c > 1)
              {
                Response.Write(
    "<Cell ss:StyleID='border'><Data ss:Type='Number'>" + dt.Rows[j][c].ToString() + "</Data></Cell>");
              }
              
    else
              {
                Response.Write(
    "<Cell ss:StyleID='border'><Data ss:Type='String'>" + dt.Rows[j][c].ToString() + "</Data></Cell>");
              }
            }
            Response.Write(
    "</Row>");
          }
          Response.Write(
    "</Table>");
          Response.Write(
    "</Worksheet>");
          Response.Flush();
        }
        Response.Write(
    "</Workbook>");
        Response.End();
      }
    </script>
  • 相关阅读:
    Android周学习Step By Step(6)Android的数据库SQLite
    Android周学习Step By Step(2)HelloWorld
    解决方案(.sln)文件
    浅谈测试(1)单元测试
    批量上传功能的实现
    分页控件AspNetPager的用法
    .net下验证码的简单实现
    window.alert重写实现友好的对话框(支持IE)
    网页上自定义运行和测试HTML脚本
    数据库行转列的sql语句(zt)
  • 原文地址:https://www.cnblogs.com/aaa6818162/p/2248281.html
Copyright © 2011-2022 走看看