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
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
Để 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.
Ở 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.
Để 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.
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.
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.
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.
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
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
Đợ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
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
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.