List數據源生成HSSFWorkbook通用方法:
public class WorkBook { public static HSSFWorkbook BuildSwitchData<T>(string SheetName, List<T> list, Dictionary<string, string> FiedNames) { HSSFWorkbook wb = new HSSFWorkbook(); HSSFSheet sheet = (HSSFSheet)wb.CreateSheet(SheetName); //創建工作表 sheet.CreateFreezePane(0, 1); //凍結列頭行 HSSFRow row_Title = (HSSFRow)sheet.CreateRow(0); //創建列頭行 row_Title.HeightInPoints = 30.5F; //設置列頭行高 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 FiedNames.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 //獲取 實體類 類型對象 Type t = typeof(T); // model.GetType(); //獲取 實體類 所有的 公有屬性 List<PropertyInfo> proInfos = t.GetProperties(BindingFlags.Instance | BindingFlags.Public).ToList(); //創建 實體屬性 字典集合 Dictionary<string, PropertyInfo> dictPros = new Dictionary<string, PropertyInfo>(); //將 實體屬性 中要修改的屬性名 添加到 字典集合中 鍵:屬性名 值:屬性對象 proInfos.ForEach(p => { if (FiedNames.Values.Contains(p.Name)) { dictPros.Add(p.Name, p); } }); 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 = 20; int jj = 0; foreach (string proName in FiedNames.Values) { if (dictPros.ContainsKey(proName)) { HSSFCell cell_Conent = (HSSFCell)row_Content.CreateCell(jj); //創建單元格 cell_Conent.CellStyle = cs_Content; //如果存在,則取出要屬性對象 PropertyInfo proInfo = dictPros[proName]; //獲取對應屬性的值 object value = proInfo.GetValue(list[i], null); //object newValue = model.uName; string cell_value = value == null ? "" : value.ToString(); cell_Conent.SetCellValue(cell_value); jj++; } } } return wb; } }
MVC控制器調用方法並以流的形式下載:
public ActionResult ProcessRequest() { try { fangcanpyEntities db = new fangcanpyEntities(); List<Models.order> list = db.order.AsNoTracking().ToList();//獲取List數據 可自行獲取 Dictionary<string, string> FiedNames = new Dictionary<string, string>(); FiedNames.Add("訂單編號", "order_no"); FiedNames.Add("下單時間", "add_time"); FiedNames.Add("會員編號", "uid"); FiedNames.Add("收件人", "accept_name"); FiedNames.Add("電話號碼", "mobile"); FiedNames.Add("收件地址", "address"); FiedNames.Add("訂單金額", "order_amount"); string sExportFileName = ""; HSSFWorkbook wb = null; wb = WorkBook.BuildSwitchData<Models.order>("訂單",list, FiedNames);//調用通用方法 sExportFileName = "訂單" + "_" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xls";//設置下載文件的名稱 MemoryStream stream = new MemoryStream(); wb.Write(stream); var buf = stream.ToArray(); return File(buf, "pplication/vnd.ms-excel", sExportFileName); } catch { return Content(""); } }