【C#】Excel匯出合并行和列並動態載入行與列

來源:互聯網
上載者:User

標籤:一個   csdn   sele   div   效果   data-   substring   增加   horizon   

簡單的Excel匯出比較好做,只要設定表頭,迴圈在表格中賦值添加資料即可,但是如果表頭是不固定的,並且個數是不確定的,這就需要根據查詢出資料的特點來添加匯出了。

 

    匯出:

如所示,商品的個數是不確定的,時間的月份個數也是不確定的,所以簡單的通過模板是不可以的。並且資料庫中查詢出的資訊是每個商品不同時間的資訊,所以查詢出的資料相同時間的可能有多條,一個商品在不同的時間分布,所以也可以是多條。

代碼部分:

 

[csharp] view plain copy 
  1. public int DataTableToExcelByMProduct(DataTable dt_model, string sheetName)  
  2.         {  
  3.             workbook = new HSSFWorkbook();  
  4.             ISheet sheet = workbook.CreateSheet(sheetName);  
  5.             IRow row = null;  
  6.             ICell cell = null;  
  7.             //樣式  
  8.             ICellStyle style = workbook.CreateCellStyle();  
  9.             style.Alignment = HorizontalAlignment.CENTER;//設定儲存格的樣式:水平對齊置中  
  10.             style.VerticalAlignment = VerticalAlignment.CENTER;//設定儲存格樣式:垂直對齊置中  
  11.             IFont font = workbook.CreateFont();//建立一個字型樣式對象  
  12.             font.Boldweight = short.MaxValue;  
  13.             style.SetFont(font);  
  14.             DateTime nowTime = DateTime.Now;  
  15.               
  16.             //商品編碼數量  
  17.             var dtgroup=(from p in dt_model.AsEnumerable()  
  18.             group p by new {  
  19.                 RealName=p.Field<string>("RealName"),  
  20.                 Name=p.Field<string>("Name")                
  21.             }into g  
  22.             select new {  
  23.                 RealName=g.Key.RealName,  
  24.                 Name=g.Key.Name,  
  25.                 counts=g.Count()  
  26.             }).ToList();  
  27.             //資料表頭,時間  
  28.               
  29.              row = sheet.CreateRow(0);  
  30.             cell = row.CreateCell(0);  
  31.             cell.SetCellValue("時間");  
  32.             cell.CellStyle = style;  
  33.             //CellRangeAddress四個參數:起始行、結束行、起始列、結束列  
  34.             sheet.AddMergedRegion(new CellRangeAddress(0, 2, 0, 0));  
  35.               
  36.             //進出口岸  1,1,2,口岸數*2  
  37.             cell = row.CreateCell(1);  
  38.             cell.SetCellValue(“進出口商品編碼”);  
  39.             cell.CellStyle = style;  
  40.             //CellRangeAddress四個參數:起始行、結束行、起始列、結束列  
  41.             sheet.AddMergedRegion(new CellRangeAddress(0, 0, 1, 2*dtgroup.Count));  
  42.               
  43.             //商品拼接  
  44.              row = sheet.CreateRow(1);  
  45.             row = sheet.CreateRow(2);  
  46.             for( int c=0;c<dtgroup.Count;c++)  
  47.             {  
  48.                 //建立進出口岸儲存格,開始  
  49.                  cell = row.CreateCell(2*c+1);  
  50.                  cell.SetCellValue(dtgroup[c].RealName);  
  51.                  cell.CellStyle = style;  
  52.             //CellRangeAddress四個參數:起始行、結束行、起始列、結束列  
  53.                 sheet.AddMergedRegion(new CellRangeAddress(1, 1, 2*c+1, 2*c+2));  
  54.                   
  55.                 //建立進口儲存格   
  56.                 //建立一列  
  57.                 cell=row.CreateCell(2*c+1);  
  58.                 cell.SetCellValue("進口");  
  59.                 cell=row.CreateCell(2*c+2);     
  60.                 cell.SetCellValue("出口");      
  61.             }  
  62.               
  63.             var AllYearCount=(from p in dt_model.AsEnumerable()  
  64.                               group p by new {Year_Month=p.Field<string>("Year_Month")} into m  
  65.                               select new   
  66.                               {  
  67.                                   YearMonth =m.Key.Year_Month,  
  68.                                   AllYearCount=m.Count()  
  69.                               }).ToList();  
  70.             //年份  
  71.             for (int i=0;i < AllYearCount.Count;i++)  
  72.             {  
  73.                 row=sheet.CreateRow(i+3);  
  74.                 cell=row.CreateCell(0);  
  75.                 string YearMonth=AllYearCount[i].YearMonth;  
  76.                   
  77.                 int month =SafeConvert.ToInt16(YearMonth.Substring(4,2));  
  78.                 cell.SetCellValue("1-"+month+"月");  
  79.   
  80.               
  81.             //貿易額對碰情況  
  82.                 for (int j=0;j<dtgroup.Count;j++)  
  83.                 {  
  84.                     var items=dt_model.AsEnumerable().Where(a=>a.Field<string>("Year_Month")==AllYearCount[i].YearMonth && a.Field<string>("Name")==dtgroup[j].Name).ToList();  
  85.                     if(items.Count>0)  
  86.                     {  
  87.                         cell=row.CreateCell(2*j+1);  
  88.                         cell.SetCellValue(items[0].Field<string>("Export_Desn"));  
  89.                         cell=row.CreateCell(2*j+2);  
  90.                         cell.SetCellValue(items[0].Field<string>("Import_Desn"));  
  91.                     }  
  92.                     else  
  93.                     {  
  94.                         cell=row.CreateCell(2*j+1);  
  95.                         cell.SetCellValue("");  
  96.                         cell=row.CreateCell(2*j+2);  
  97.                         cell.SetCellValue("");  
  98.                     }  
  99.                   
  100.                 }  
  101.             }  
  102.             using(FileStream fsm=File.Open(fileName,FileMode.OpenOrCreate,FileAccess.ReadWrite))  
  103.             {  
  104.                 workbook.Write(fsm);  
  105.                 fsm.Close();  
  106.             }  
  107.             return 1;  
  108.               
  109.         }  
  110.               



 

   其實代碼的核心部分就是建立行與列並且為表格賦值,如果已經建立了行就不用建立了,就像這個例子中的時間儲存格已經建立了一次行,這樣“進出口商品編碼”就不用再次建立行了。但是建立了行必須要建立列,列是在行的基礎上建立的,所以即使上一行已經建立了列,下一行還是需要重新建立的。

 

 

小結:

     這個方法傳入的是datatable和表格名稱,如果我們返回的資料不是直接輸出的需要做一些處理,我們可以採用給datatable增加欄位的方法,將我們想要的結果儲存到新加的欄位中。

     匯出的思想是一樣的,都是要迴圈行和列,在表格中賦值,不同的是從哪裡開始賦,把不同的地方解決,匯出也一樣easy!

【C#】Excel匯出合并行和列並動態載入行與列

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.