ASP.NET 導出EXCEL文件處理多對應排列的

        此次項目遇到了一個導出excel須要對應排列的問題。原本在作這個項目以前都基本沒作過excel導出的菜雞,此次強行作仍是有些忐忑的,加上那個表的結構比較奇特。ui

     廢話很少說,先介紹表結構吧 是數據對應的排序周的表結構,一個列會有不少的周別信息,以下圖展現:spa

       因爲才疏學淺,並無遇到過這種列裏面有16*2=32列的這種保存數據的方法,一列保存的是周別的信息,另外一列保存的是數量信息。excel

     當時就有想啊,我擦那直接導出來不就行了,直接就對應上了多簡單!可是轉念一想呢,萬一要導出的不止16條呢,那後面的怎麼加呢,和同事商量以後,有個同事的作法是列轉行,就是把這個全部的列都轉成行,這樣就能按照屬性(周別和數量)所有拿到數據了,可是呢,可是我比較煩寫存儲過程,想本身想一想辦法,加上我這邊的篩選條件是有一個選擇周別區間的,因此我本身想了一個辦法,處理了這類的表。code

     這個界面能獲取到的條件除了限定的這一條是屬於誰的(查詢條件的名稱),還有就是起始周和周別和數量信息,這幾個重要的信息了,值得一提的是,這裏的起始周是這16列數據第一列的周別,因此是叫作起始周,這個字段能夠好好的利用。orm

       再從新解釋下導出需求,導出要根據名稱,導出的起始周和結束週日後推16這周的信息。這裏爲何要推後16周呢,恩,需求書上說的,沒有爲何。並且導出的數據要成那種菱形,就是那種那種額 不發圖表達不了啊。。。仍是發圖吧。blog

 

       就是這種前凸後翹的表格了,怎麼說。。。排序

  這樣看來,這裏的首行的列名,也就是他們的列臺頭就很重要, 由於下面的數據都要與之對應的上,全部擡頭必需要長,儘可能的長長長長長。。。。。。。。。。。。。。。。。。。(大概這麼長)。ip

       到了這一步,也是能夠參考同事說的那種,就是那種,那種列轉行的作法的,把全部的列都存在一列之中,而後DISTINCT出來作列頭這樣。可是我是真的懶得寫存儲過程。。。。string

  怎麼作呢,前文提到我這裏是有起始周的,因而我獲取告終束周(這裏的起始周和結束周都是能夠與表中的起始週數據進行篩選的),而後日後推了16周,這樣就能獲取到全部查詢到的數據的周別了。it

       而後讓每一條數據的起始周與列的臺頭進行對比,若是周別是同樣的,就放在對應的位置,上碼上碼!!!

 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             }

效果作出來了,可把我牛逼壞了,插會腰。

相關文章
相關標籤/搜索