zoukankan      html  css  js  c++  java
  • ASP.NET 导出EXCEL文件处理多对应排列的

            这次项目遇到了一个导出excel需要对应排列的问题。本来在做这个项目之前都基本没做过excel导出的菜鸡,这次强行做还是有些忐忑的,加上那个表的结构比较奇特。

         废话不多说,先介绍表结构吧 是数据对应的排序周的表结构,一个列会有很多的周别信息,如下图展示:

           由于才疏学浅,并没有遇到过这种列里面有16*2=32列的这种保存数据的方法,一列保存的是周别的信息,另一列保存的是数量信息。

         当时就有想啊,我擦那直接导出来不就好了,直接就对应上了多简单!但是转念一想呢,万一要导出的不止16条呢,那后面的怎么加呢,和同事商量之后,有个同事的做法是列转行,就是把这个所有的列都转成行,这样就能按照属性(周别和数量)全部拿到数据了,但是呢,但是我比较烦写存储过程,想自己想想办法,加上我这边的筛选条件是有一个选择周别区间的,所以我自己想了一个办法,处理了这类的表。

         这个界面能获取到的条件除了限定的这一条是属于谁的(查询条件的名称),还有就是起始周和周别和数量信息,这几个重要的信息了,值得一提的是,这里的起始周是这16列数据第一列的周别,所以是叫做起始周,这个字段可以好好的利用。

           再重新解释下导出需求,导出要根据名称,导出的起始周和结束周往后推16这周的信息。这里为什么要推后16周呢,恩,需求书上说的,没有为什么。而且导出的数据要成那种菱形,就是那种那种额 不发图表达不了啊。。。还是发图吧。

     

           就是这种前凸后翘的表格了,怎么说。。。

      这样看来,这里的首行的列名,也就是他们的列台头就很重要, 因为下面的数据都要与之对应的上,所有抬头必须要长,尽量的长长长长长。。。。。。。。。。。。。。。。。。。(大概这么长)。

           到了这一步,也是可以参考同事说的那种,就是那种,那种列转行的做法的,把所有的列都存在一列之中,然后DISTINCT出来做列头这样。但是我是真的懒得写存储过程。。。。

      怎么做呢,前文提到我这里是有起始周的,于是我获取了结束周(这里的起始周和结束周都是可以与表中的起始周数据进行筛选的),然后往后推了16周,这样就能获取到所有查询到的数据的周别了。

           然后让每一条数据的起始周与列的台头进行对比,如果周别是一样的,就放在对应的位置,上码上码!!!

     1  try
     2             {
     3                 string InquiiryFile = HttpContext.Current.Server.MapPath("~") + "\Excel\xxx.xlsx";
     4                 if (!File.Exists(InquiiryFile))
     5                 {
     6                     Page.RegisterStartupScript("", "<script>alert( '无法加载样式表,请与管理员联系!')</script>");
     7                 }
     8                 //导出
     9                 DataTable DT = init();
    10                 if (DT.Rows.Count > 0)
    11                 {
    12                     Aspose.Cells.License lic = new Aspose.Cells.License();
    13                     lic.SetLicense("Aspose.Cells.lic");
    14                     Aspose.Cells.Workbook excel = new Aspose.Cells.Workbook();
    15                     excel.Open(InquiiryFile);
    16                     Aspose.Cells.Worksheet sheet = excel.Worksheets[0];
    17                     sheet = excel.Worksheets[0];
    18                     string startWeek = txtStartWeek.Value;
    19                     string endWeek = txtEndWeek.Value;
    20                     if (endWeek != "")
    21                     {
    22                         int weeknumber = Convert.ToInt32(endWeek.Substring(4, 2));
    23                         int years = Convert.ToInt32(endWeek.Substring(0, 4));
    24                         if (weeknumber + 16> 52)
    25                         {
    26                             weeknumber = weeknumber + 16- 52;
    27                             if (weeknumber < 10)
    28                             {
    29                                 years = years + 1;
    30                                 endWeek = years.ToString() + "0" + weeknumber.ToString();
    31                             }
    32                             else
    33                             {
    34                                 years = years + 1;
    35                                 endWeek = years.ToString() + weeknumber.ToString();
    36                             }
    37                         }
    38                         else
    39                         {
    40                             weeknumber = weeknumber + 16;
    41                             endWeek = years.ToString() + weeknumber.ToString();
    42                         }
    43                     }
    44                     string where = "1=1";
    45                     if (startWeek != "")
    46                     {
    47                         where += " and  [monthName]>='" + startWeek + "'";
    48                     }
    49                     if (endWeek != "")
    50                     {
    51                         where += " and [monthName]<='" + endWeek + "'";
    52                     }
    53                     DataTable dtweek = bll.byWeek(where);//获取到了所有的周别
    54                     int dtweeknumber = dtweek.Rows.Count;
    55                     for (int i = 0; i < dtweek.Rows.Count; i++)
    56                     {
    57                         sheet.Cells[0, (12 + i)].PutValue("WK" + (dtweek.Rows[i]["monthName"].ToString()).Substring(4, 2));
    58                         string monthName = dtweek.Rows[i]["startTime"].ToString();
    59                         monthName = monthName.Substring(0, 4) + "" + monthName.Substring(4, 2) + "" + monthName.Substring(6, 2) + "";
    60                         sheet.Cells[1, (12 + i)].PutValue(monthName);
    61                     }
    62                     for (int i = 0; i < DT.Rows.Count; i++)
    63                     {
    64                         sheet.Cells[i + 2, 0].PutValue(DT.Rows[i]["Name"].ToString()); //名称  
    65  sheet.Cells[i + 2, 1].PutValue("WK" + (DT.Rows[i]["startWeek"].ToString()).Substring(4, 2));             //起始周    
    66                         if (DT.Rows[i]["startWeek"] != DBNull.Value)
    67                         {
    68                             for (int j = 0; j < dtweeknumber; j++)
    69                             {
    70                                 if (DT.Rows[i]["startWeek"].ToString() == dtweek.Rows[j]["monthName"].ToString())
    71                                 {
    72                                     sheet.Cells[i + 2, 3+ j].PutValue(Convert.ToInt32(DT.Rows[i]["wkN"]));//起始周的位置
    73                                     for (int w = 1; w < 16; w++)
    74                                     {
    75                                         sheet.Cells[i + 2, 3+ j + w].PutValue(Convert.ToInt32(DT.Rows[i]["wkN" + w + ""]));//后续的数据插入位置
    76                                     }
    77                                 }
    78                             }
    79                         }
    80 
    81                     }
    82 
    83                     sheet.AutoFitColumns();
    84                     string excelName = "xxx" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + ".xlsx";
    85                     excel.Save(excelName, Aspose.Cells.FileFormatType.Excel2007Xlsx, Aspose.Cells.SaveType.OpenInExcel, HttpContext.Current.Response);
    86                     Response.End();                 
    87                 }
    88             }
    89             catch (Exception ex)
    90             {
    91                 RegisterClientScriptBlock("", "<script>alert('" + ex.Message + "')</script>");
    92             }

    效果做出来了,可把我牛逼坏了,插会腰。

  • 相关阅读:
    Java基础教程:对象比较排序
    算法:深度优先搜索
    微信小程序开发:学习笔记[5]——JavaScript脚本
    微信小程序开发:学习笔记[4]——样式布局
    设计模式:学习笔记(8)——装饰器模式
    设计模式:学习笔记(7)——原型模式
    设计模式——单例模式解析
    玩转Android之数据库框架greenDAO3.0使用指南
    Android开发工具——Android Studio调试技巧
    VR开发的烦恼——范围限制
  • 原文地址:https://www.cnblogs.com/Grande/p/7115428.html
Copyright © 2011-2022 走看看