Chủ Nhật, 14 tháng 10, 2018

Xuất file Excel trong ASP.NET MVC






Chức năng xuất file Excel rất thường được sử dụng trong trang quản trị với các chức năng như backup, thống kê, báo cáo. Bài viết này hướng dẫn bạn thực hiện chức năng này bằng cách sử dụng package ClosedXml trên nền tảng web ASP.NET MVC.




Tạo ASP.NET MVC Project


Để tạo ứng dụng ASP.NET MVC mới, hãy mở Visual Studio, chuyển đến menu File và chọn New < Project.

Cửa sổ “New Project” hiện ra. Sau đó bạn chọn Visual C # < Web và từ khung bên phải, chỉ cần chọn ASP.NET Web Application. Nhập tên của ứng dụng “ExportExcelDemo” và nhấn OK.




Sau đó check vào lựa chọn MVC và click OK.




Thêm Entity Class


Chúng ta sẽ lấy dữ liệu từ cơ sở dữ liệu. Đầu tiên chúng ta sẽ thêm một số entity classes and 1 database access class.

Để thêm 1 class Model mới, click chuột phải vào thư mục Models và chọn Add Class.
Vì vậy, mình sẽ thêm các lớp thực thể và các lớp DbContext sau đây.


Employee.cs

  
 using System;
        using System.ComponentModel.DataAnnotations;
        namespace ExportExcelDemo.Models
        {
            public class Employee
            {
                [Key]
                public int Id
                {
                    get;
                    set;
                }
                public string Name
                {
                    get;
                    set;
                }
                public string Email
                {
                    get;
                    set;
                }
                public int Age
                {
                    get;
                    set;
                }
                public string Address
                {
                    get;
                    set;
                }
                public int DepartmentId
                {
                    get;
                    set;
                }
            }
        }


Department.cs


using System.ComponentModel.DataAnnotations; 
namespace ExportExcelDemo.Models
{
    public class Department
    {
        [Key]
        public int DepartmentId
        {
            get;
            set;
        }
        public string DepartmentName
        {
            get;
            set;
        }
    }


DbAccessContext.cs


Ở bài viết này mình đang sử dụng phương pháp Entity Framework Code First để lấy dữ liệu.

using System.Data.Entity;
namespace ExportExcelDemo.Models
{
    public class DbAccessContext : DbContext
    {
        public DbAccessContext() : base("DefaultConnection") { }
        public DbSet<Employee> Employees
        {
            get;
            set;
        }
        public DbSet<Department> Departments
        {
            get;
            set;
        }
    }
}


EmployeeViewModel.cs


namespace ExportExcelDemo.Models
{
    public class EmployeeViewModel
    {
        public string Name
        {
            get;
            set;
        }
        public string Email
        {
            get;
            set;
        }
        public int Age
        {
            get;
            set;
        }
        public string Address
        {
            get;
            set;
        }
        public string Department
        {
            get;
            set;
        }
    }
}


Add ClosedXml Library


Để xuất dữ liệu vào tệp Excel, chúng ta sử dụng thư viện ClosedXml. Để thêm nó vào ứng dụng của bạn, nhấn chuột phải vào dự án của bạn và chọn NuGet Manager. Ở đây, bạn cần phải tìm kiếm như hình dưới và nhấp vào Install.




Đợi một vài phút để thư viện ClosedXml được cài tự động vào ứng dụng của bạn.




Add Controller


Mình tiến hành tạo EmployeeController. Ở đây, mình sẽ viết code để lấy dữ liệu từ cơ sở dữ liệu, sử dụng phương pháp tiếp cận Code First và khi click vào button, ứng dụng sẽ xuất dữ liệu sang tệp Excel.

EmployeeController.cs

using ClosedXML.Excel;
using ExportExcelDemo.Models;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace ExportExcelDemo.Controllers
{
    public class EmployeeController : Controller
    {
        public IList<EmployeeViewModel> GetEmployeeList()
        {
            DbAccessContext db = new DbAccessContext();
            var employeeList = (from e in db.Employees
                                join d in db.Departments on e.DepartmentId equals d.DepartmentId
                                select new EmployeeViewModel {
                                    Name = e.Name,
                                    Email = e.Email,
                                    Age = (int)e.Age,
                                    Address = e.Address,
                                    Department = d.DepartmentName
                                }).ToList();
            return employeeList;
        }
        // GET: Employee 
        public ActionResult Index()
        {
            return View(this.GetEmployeeList());
        }
        public ActionResult ExportToExcel()
        {
            var gv = new GridView();
            gv.DataSource = this.GetEmployeeList();
            gv.DataBind();
            Response.ClearContent();
            Response.Buffer = true;
            Response.AddHeader("content-disposition", "attachment; filename=DemoExcel.xls");
            Response.ContentType = "application/ms-excel";
            Response.Charset = "";
            StringWriter objStringWriter = new StringWriter();
            HtmlTextWriter objHtmlTextWriter = new HtmlTextWriter(objStringWriter);
            gv.RenderControl(objHtmlTextWriter);
            Response.Output.Write(objStringWriter.ToString());
            Response.Flush();
            Response.End();
            return View("Index");
        }
    }
}


Add View


Bây giờ, đã đến lúc thêm view để hiển thị dữ liệu. Do đó, hãy thêm view Index.cshtml và thay thế mã trong view thành như sau.


Index.cshtml


@model IList 
<ExportExcelDemo.Models.EmployeeViewModel>
@{ 
ViewBag.Title = "Index"; 
Layout = "~/Views/Shared/_Layout.cshtml"; 
@using (Html.BeginForm("ExportToExcel", "Employee", FormMethod.Post)) 
<br /> 
<br /> 
<h2> 
   Export Data To Excel 
</h2>
<table style="background-color: white; width: 100%;">
   <tr>
      <th style="border: 1px solid black; text-align: left; width: 20%; padding-left: 20px;"> 
         Name 
      </th>
      <th style="border: 2px solid black; text-align: center; width: 20%"> 
         Email 
      </th>
      <th style="border: 2px solid black; text-align: center; width: 20%"> 
         Age 
      </th>
      <th style="border: 2px solid black; text-align: center; width: 20%"> 
         Address 
      </th>
      <th style="border: 2px solid black; text-align: center; width: 20%"> 
         Department 
      </th>
   </tr>
   @foreach (var itm in Model) 
   { 
   <tr>
      <td style="padding-left: 20px;"> 
         @Html.DisplayFor(m => itm.Name) 
      </td>
      <td style="padding-left: 20px;"> 
         @Html.DisplayFor(m => itm.Email) 
      </td>
      <td style="padding-left: 20px;"> 
         @Html.DisplayFor(m => itm.Age) 
      </td>
      <td style="padding-left: 50px;"> 
         @Html.DisplayFor(m => itm.Address) 
      </td>
      <td style="padding-left: 50px;"> 
         @Html.DisplayFor(m => itm.Department) 
      </td>
   </tr>
   } 
   <tr>
      <td colspan="4"> 
         <br /> 
         <br /> 
         <input type="submit" value="Export to Excel" class="button" /> 
      </td>
   </tr>
</table>
}


Web.Config


<connectionStrings> 
<add name = "DefaultConnection" connectionString="Data Source=my-computer;Initial Catalog=TestEmployee;Integrated Security=True; user id=mukesh; password=mukesh;" providerName="System.Data.SqlClient" /> 
</connectionStrings> 

Mọi thứ đã hoàn thành. Tiến hành chạy app. Trình duyệt sẽ hiện kết quả như hình sau.



Bảng dữ liệu được lấy từ CSDL và khi bạn nhấn nút "Export to Excel" thì ứng dụng sẽ tải file Excel chứa dữ liệu như bảng về máy tính bạn. Vậy là thành công rồi đó.

Mọi thắc mắc bạn bình luận dưới bài viết nhé. Chúc bạn thực hành thành công.