此次項目遇到了一個導出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 }
效果作出來了,可把我牛逼壞了,插會腰。