標籤:一個 csdn sele div 效果 data- substring 增加 horizon
簡單的Excel匯出比較好做,只要設定表頭,迴圈在表格中賦值添加資料即可,但是如果表頭是不固定的,並且個數是不確定的,這就需要根據查詢出資料的特點來添加匯出了。
匯出:
如所示,商品的個數是不確定的,時間的月份個數也是不確定的,所以簡單的通過模板是不可以的。並且資料庫中查詢出的資訊是每個商品不同時間的資訊,所以查詢出的資料相同時間的可能有多條,一個商品在不同的時間分布,所以也可以是多條。
代碼部分:
[csharp] view plain copy
- public int DataTableToExcelByMProduct(DataTable dt_model, string sheetName)
- {
- workbook = new HSSFWorkbook();
- ISheet sheet = workbook.CreateSheet(sheetName);
- IRow row = null;
- ICell cell = null;
- //樣式
- ICellStyle style = workbook.CreateCellStyle();
- style.Alignment = HorizontalAlignment.CENTER;//設定儲存格的樣式:水平對齊置中
- style.VerticalAlignment = VerticalAlignment.CENTER;//設定儲存格樣式:垂直對齊置中
- IFont font = workbook.CreateFont();//建立一個字型樣式對象
- font.Boldweight = short.MaxValue;
- style.SetFont(font);
- DateTime nowTime = DateTime.Now;
-
- //商品編碼數量
- var dtgroup=(from p in dt_model.AsEnumerable()
- group p by new {
- RealName=p.Field<string>("RealName"),
- Name=p.Field<string>("Name")
- }into g
- select new {
- RealName=g.Key.RealName,
- Name=g.Key.Name,
- counts=g.Count()
- }).ToList();
- //資料表頭,時間
-
- row = sheet.CreateRow(0);
- cell = row.CreateCell(0);
- cell.SetCellValue("時間");
- cell.CellStyle = style;
- //CellRangeAddress四個參數:起始行、結束行、起始列、結束列
- sheet.AddMergedRegion(new CellRangeAddress(0, 2, 0, 0));
-
- //進出口岸 1,1,2,口岸數*2
- cell = row.CreateCell(1);
- cell.SetCellValue(“進出口商品編碼”);
- cell.CellStyle = style;
- //CellRangeAddress四個參數:起始行、結束行、起始列、結束列
- sheet.AddMergedRegion(new CellRangeAddress(0, 0, 1, 2*dtgroup.Count));
-
- //商品拼接
- row = sheet.CreateRow(1);
- row = sheet.CreateRow(2);
- for( int c=0;c<dtgroup.Count;c++)
- {
- //建立進出口岸儲存格,開始
- cell = row.CreateCell(2*c+1);
- cell.SetCellValue(dtgroup[c].RealName);
- cell.CellStyle = style;
- //CellRangeAddress四個參數:起始行、結束行、起始列、結束列
- sheet.AddMergedRegion(new CellRangeAddress(1, 1, 2*c+1, 2*c+2));
-
- //建立進口儲存格
- //建立一列
- cell=row.CreateCell(2*c+1);
- cell.SetCellValue("進口");
- cell=row.CreateCell(2*c+2);
- cell.SetCellValue("出口");
- }
-
- var AllYearCount=(from p in dt_model.AsEnumerable()
- group p by new {Year_Month=p.Field<string>("Year_Month")} into m
- select new
- {
- YearMonth =m.Key.Year_Month,
- AllYearCount=m.Count()
- }).ToList();
- //年份
- for (int i=0;i < AllYearCount.Count;i++)
- {
- row=sheet.CreateRow(i+3);
- cell=row.CreateCell(0);
- string YearMonth=AllYearCount[i].YearMonth;
-
- int month =SafeConvert.ToInt16(YearMonth.Substring(4,2));
- cell.SetCellValue("1-"+month+"月");
-
-
- //貿易額對碰情況
- for (int j=0;j<dtgroup.Count;j++)
- {
- var items=dt_model.AsEnumerable().Where(a=>a.Field<string>("Year_Month")==AllYearCount[i].YearMonth && a.Field<string>("Name")==dtgroup[j].Name).ToList();
- if(items.Count>0)
- {
- cell=row.CreateCell(2*j+1);
- cell.SetCellValue(items[0].Field<string>("Export_Desn"));
- cell=row.CreateCell(2*j+2);
- cell.SetCellValue(items[0].Field<string>("Import_Desn"));
- }
- else
- {
- cell=row.CreateCell(2*j+1);
- cell.SetCellValue("");
- cell=row.CreateCell(2*j+2);
- cell.SetCellValue("");
- }
-
- }
- }
- using(FileStream fsm=File.Open(fileName,FileMode.OpenOrCreate,FileAccess.ReadWrite))
- {
- workbook.Write(fsm);
- fsm.Close();
- }
- return 1;
-
- }
-
其實代碼的核心部分就是建立行與列並且為表格賦值,如果已經建立了行就不用建立了,就像這個例子中的時間儲存格已經建立了一次行,這樣“進出口商品編碼”就不用再次建立行了。但是建立了行必須要建立列,列是在行的基礎上建立的,所以即使上一行已經建立了列,下一行還是需要重新建立的。
小結:
這個方法傳入的是datatable和表格名稱,如果我們返回的資料不是直接輸出的需要做一些處理,我們可以採用給datatable增加欄位的方法,將我們想要的結果儲存到新加的欄位中。
匯出的思想是一樣的,都是要迴圈行和列,在表格中賦值,不同的是從哪裡開始賦,把不同的地方解決,匯出也一樣easy!
【C#】Excel匯出合并行和列並動態載入行與列