1. 程式人生 > 其它 >利用Dapper和NPOI將SQL結果生成Excel表格

利用Dapper和NPOI將SQL結果生成Excel表格

可以將任意SQL查詢結果生成Excel表格以供下載

1.引用依賴包

 

 

 

 2.執行查詢SQL,獲得結果列表

var sql = "SELECT Id AS N'學生編號', Name AS N'學生姓名' FROM Student";
var queryList = _context.Database.GetDbConnection().Query(sql).ToList();

檢視Query方法定義可知返回結果雖然是IEnumerable<dynamic>,實際上是IEnumerable<DapperRow>

檢視DapperRow定義可知其支援IDictionary<string, object>介面,實際上只要支援該介面均可動態生成Excel表格

 

 

 

3.傳入表名和queryList呼叫以下方法,取第一個元素的鍵名作為表頭名,然後生成Excel表格物件

public static HSSFWorkbook BuildSwitchData(string sheetName, IList<dynamic> list)
        {
            if (list == null || !list.Any())
                return null;

            var keys = ((IDictionary<string, object>)list.First()).Keys;
            HSSFWorkbook wb 
= new HSSFWorkbook(); HSSFSheet sheet = (HSSFSheet)wb.CreateSheet(SheetName); //建立工作表 sheet.CreateFreezePane(0, 1); //凍結列頭行 HSSFRow row_Title = (HSSFRow)sheet.CreateRow(0); //建立列頭行 row_Title.HeightInPoints = 25F; //設定列頭行高 HSSFCellStyle cs_Title = (HSSFCellStyle)wb.CreateCellStyle(); //
建立列頭樣式 cs_Title.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center; //水平居中 cs_Title.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center; //垂直居中 HSSFFont cs_Title_Font = (HSSFFont)wb.CreateFont(); //建立字型 cs_Title_Font.IsBold = true; //字型加粗 cs_Title_Font.FontHeightInPoints = 14; //字型大小 cs_Title.SetFont(cs_Title_Font); //將字型繫結到樣式 #region 生成列頭 int ii = 0; foreach (string key in keys) { HSSFCell cell_Title = (HSSFCell)row_Title.CreateCell(ii); //建立單元格 cell_Title.CellStyle = cs_Title; //將樣式繫結到單元格 cell_Title.SetCellValue(key); sheet.SetColumnWidth(ii, 25 * 256);//設定列寬 ii++; } #endregion HSSFCellStyle cs_Content = (HSSFCellStyle)wb.CreateCellStyle(); //建立列頭樣式 cs_Content.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center; //水平居中 cs_Content.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center; //垂直居中 for (int i = 0; i < list.Count; i++) { HSSFRow row_Content = (HSSFRow)sheet.CreateRow(i + 1); //建立行 row_Content.HeightInPoints = 15; int jj = 0; var values = ((IDictionary<string, object>)list[i]).Values.ToArray(); for (int j = 0; j < values.Length; j++) { HSSFCell cell_Conent = (HSSFCell)row_Content.CreateCell(jj); //建立單元格 cell_Conent.CellStyle = cs_Content; //獲取對應屬性的值 object value = values[j]; string cell_value = value == null ? "" : value.ToString(); cell_Conent.SetCellValue(cell_value); jj++; } } return wb; }

 

4.將表格物件寫入記憶體後,做為檔案流返回給瀏覽器下載該檔案

        private IActionResult GenExportResult(string name, IList<dynamic> dataList)
        {
            var excelBook = NpoiExcelExportUtils.BuildSwitchData("table", dataList);
            if(excelBook == null)
                return NoContent();

            //將Excel表格轉化為流,輸出
            MemoryStream bookStream = new MemoryStream();//建立檔案流
            excelBook.Write(bookStream);
            bookStream.Seek(0, SeekOrigin.Begin);//輸出之前呼叫Seek,把0位置指定為開始位置
            var fileName = name + DateTime.Now.ToString("yyyy-MM-dd") + ".xls";//檔名

            HttpContext.Response.Headers.Add("Name", System.Web.HttpUtility.UrlEncode(fileName));
            HttpContext.Response.Headers.Add("Access-Control-Expose-Headers", "Name");
            return File(bookStream, "application/vnd.ms-excel", fileName);//最後以檔案形式返回
        }