1.新建MVC項目,新建控制器、視圖
添加控制器:
添加視圖(將使用布局頁前面的復選框里的勾勾去掉)
2.在Models里新建一個類
public class Shop { /// <summary> /// 編號 /// </summary> public int Number { get; set; } /// <summary> /// 商品名稱 /// </summary> public string ShopName { get; set; } /// <summary> /// 商品價格 /// </summary> public double Price { get; set; } /// <summary> /// 商品種類 /// </summary> public string ShopType { get; set; } /// <summary> /// 時間 /// </summary> public DateTime Date { get; set; } /// <summary> /// 添加數據 /// </summary> /// <returns></returns> public List<Shop> AddShop() { var shops = new List<Shop>(); shops.Add(new Shop() { Number = 1001, ShopName = "小熊餅干", Price = 9.9, ShopType = "零食", Date = DateTime.Now }); shops.Add(new Shop() { Number = 1002, ShopName = "旺仔QQ糖", Price = 5.6, ShopType = "零食", Date = DateTime.Now }); shops.Add(new Shop() { Number = 1001, ShopName = "奧利奧餅干", Price = 15.5, ShopType = "零食", Date = DateTime.Now }); return shops; } }
3.在控制器里新增一個方法,編寫導出的代碼
public FileResult ExportData() { Shop shop = new Shop(); //獲得數據 var Data=shop.AddShop(); //創建一個新的excel文件 HSSFWorkbook book = new HSSFWorkbook(); //創建一個工作區 ISheet sheet = book.CreateSheet("sheet1"); //創建一行 也就是在sheet1這個工作區創建一行 在NPOI中只有先創建才能后使用 IRow row = sheet.CreateRow(0); for (int i = 0; i < 5; i++) { //設置單元格的寬度 sheet.SetColumnWidth(i, 16 * 156); } sheet.SetColumnWidth(4, 30 * 156); sheet.SetColumnWidth(1, 21 * 156); //定義一個樣式,迎來設置樣式屬性 ICellStyle setborder = book.CreateCellStyle(); //設置單元格上下左右邊框線 但是不包括最外面的一層 setborder.BorderLeft = BorderStyle.Thin; setborder.BorderRight = BorderStyle.Thin; setborder.BorderBottom = BorderStyle.Thin; setborder.BorderTop = BorderStyle.Thin; //文字水平和垂直對齊方式 setborder.VerticalAlignment = VerticalAlignment.Center;//垂直居中 setborder.Alignment = HorizontalAlignment.Center;//水平居中 setborder.WrapText = true;//自動換行 //再定義一個樣式,用來設置最上面標題行的樣式 ICellStyle setborderdeth = book.CreateCellStyle(); //設置單元格上下左右邊框線 但是不包括最外面的一層 setborderdeth.BorderLeft = BorderStyle.Thin; setborderdeth.BorderRight = BorderStyle.Thin; setborderdeth.BorderBottom = BorderStyle.Thin; setborderdeth.BorderTop = BorderStyle.Thin; //定義一個字體樣式 IFont font = book.CreateFont(); //將字體設為紅色 font.Color = IndexedColors.Red.Index; //font.FontHeightInPoints = 17; //將定義的font樣式給到setborderdeth樣式中 setborderdeth.SetFont(font); //文字水平和垂直對齊方式 setborderdeth.VerticalAlignment = VerticalAlignment.Center;//垂直居中 setborderdeth.Alignment = HorizontalAlignment.Center;//水平居中 setborderdeth.WrapText = true; //自動換行 //設置第一行單元格的高度為25 row.HeightInPoints = 25; //設置單元格的值 row.CreateCell(0).SetCellValue("編號"); //將style屬性給到這個單元格 row.GetCell(0).CellStyle = setborderdeth; row.CreateCell(1).SetCellValue("商品名稱"); row.GetCell(1).CellStyle = setborderdeth; row.CreateCell(2).SetCellValue("商品價格"); row.GetCell(2).CellStyle = setborderdeth; row.CreateCell(3).SetCellValue("商品種類"); row.GetCell(3).CellStyle = setborderdeth; row.CreateCell(4).SetCellValue("日期"); row.GetCell(4).CellStyle = setborderdeth; //循環的導出到excel的每一行 for (int i = 0; i < Data.Count; i++) { //每循環一次,就新增一行 索引從0開始 所以第一次循環CreateRow(1) 前面已經創建了標題行為0 IRow row1 = sheet.CreateRow(i + 1); row1.HeightInPoints = 21; //給新加的這一行創建第一個單元格,並且給這第一個單元格設置值 以此類推... row1.CreateCell(0).SetCellValue(Convert.ToString(Data[i].Number)); //先獲取這一行的第一個單元格,再給其設置樣式屬性 以此類推... row1.GetCell(0).CellStyle = setborder; row1.CreateCell(1).SetCellValue(Data[i].ShopName); row1.GetCell(1).CellStyle = setborder; row1.CreateCell(2).SetCellValue(Convert.ToString(Data[i].Price)); row1.GetCell(2).CellStyle = setborder; row1.CreateCell(3).SetCellValue(Data[i].ShopType); row1.GetCell(3).CellStyle = setborder; row1.CreateCell(4).SetCellValue(Convert.ToString(Data[i].Date)); row1.GetCell(4).CellStyle = setborder; } System.IO.MemoryStream ms = new System.IO.MemoryStream(); book.Write(ms); ms.Seek(0, SeekOrigin.Begin); DateTime dttime = DateTime.Now; string datetime = dttime.ToString("yyyy-MM-dd"); string filename = "報表導出" + datetime + ".xls"; return File(ms, "application/vns.ms-excel", filename); }
如果導出的表頭比較復雜,你也可以將要導出的模板放在項目中,直接去讀導出的模板文件,不用在代碼中去生成表頭,直接往里面填充數據即可。
FileStream file = new FileStream(_hostingEnvironment.WebRootPath + "\\excel\\Report.xls", FileMode.Open, FileAccess.Read);//讀入excel模板 MemoryStream ms = new MemoryStream(); file.CopyTo(ms); ms.Seek(0, SeekOrigin.Begin); IWorkbook book = new HSSFWorkbook(ms); //獲得工作區sheet1 ISheet sheet = book.GetSheetAt(0);
//...
//業務代碼及表格樣式
//...
file.Dispose();
file.Close();
4.視圖頁引入腳本文件及編寫相應代碼
@{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>Index</title> <link href="http://localhost:64014/bootstrap/css/bootstrap.min.css" rel="stylesheet" /> <script src="http://localhost:64014/js/jquery-3.4.0.min.js"></script> <script src="http://localhost:64014/bootstrap/js/bootstrap.min.js"></script> <style type="text/css"> * { margin: 0px; padding: 0px; } button { margin-top: 5px; margin-left: 5px; } </style> <script type="text/javascript"> function exports() { //用ajax調用導出方法 $.ajax({ type: 'GET', url: '/Export/ExportData', success: function () { //注:Ajax直接調用后台的下載方法是導出不了文件的,原因是ajax無法接收后台的文件流,所以,需要再次用window.location=url或者window.open(url)下載 window.location = '/Export/ExportData' } }) } </script> </head> <body> <div> @*按鈕用bootstrap渲染一下,會好看一些(*^_^*)*@ <button class="btn btn-info" style="width:90px" onclick="exports()">導出</button> </div> </body> </html>
5.效果: