现在的位置: 首页 > 综合 > 正文

将 GridView 中的内容导出到 Excel 中多个工作表(Sheet) 的方法

2013年07月18日 ⁄ 综合 ⁄ 共 5608字 ⁄ 字号 评论关闭

GridView 中的内容导出到 Excel 中多个工作表(Sheet) 的方法

作者:孟宪会 发表于:2010-09-09 00:00:45

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

      
    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="+Server.UrlEncode("孟宪会Excel表格测试")+".xls");
    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>

==========================================
这方法太棒了

抱歉!评论已关闭.