asp.net Mvc 使用NPOI導出Excel文件

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);
        }

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.效果:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章