利用Dapper和NPOI將SQL結果生成Excel表格
阿新 • • 發佈:2022-04-08
可以將任意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);//最後以檔案形式返回 }