Export Excel cực dễ với ClosedXML

ClosedXML là một thư viện hỗ trợ lập trình viên .Net tạo ra các file Excel 2007+ để làm report báo cáo một cách dễ dàng và nhanh chóng, ClosedXML giúp lập trình viên làm việc với excel theo các tiếp cận hướng đối tượng mà không cần phải quan tâm quá nhiều đến cấu trúc quá phức tạp của XML.

Trước đây mình cũng có làm 1 ví dụ về việc Import Excel trong Asp.Net, lúc đó mình chưa sử dụng ClosedXML, và để chạy được chức năng Import hoặc Export Excel bắt buộc server sẽ phải cài đặt sẵn  AccessDatabaseEngine.

Với ClosedXML sẽ giúp mọi việc trở nên dễ dàng hơn, nó không yêu cầu server phải cài đặt sẵn AccessDatabaseEngine, và việc xuất file excel cũng vô cùng đơn giản, chỉ với 4 dòng code dưới đây các bạn có thể tạo ra 1 file excel đúng chuẩn.

var workbook = new XLWorkbook();
var worksheet = workbook.Worksheets.Add("Sample Sheet");
worksheet.Cell("A1").Value = "Hello World!";
workbook.SaveAs("HelloWorld.xlsx");

Để dễ hình dung hơn, trong bài này mình làm một ví dụ về việc Export file Excel trong Asp.net MVC

 

1. Cài đặt ClosedXML

Để cài đặt ClosedXML các bạn chạy dòng lệnh sau trong Nuget Manager Console

PM> Install-Package ClosedXML

Sau khi cài đặt xong ClosedXML, ta tạo ClosedXMLController.cs và View tương ứng

2. ClosedXMLController.cs

Chúng ta cần viết một hàm tạo dữ liệu để test, các bạn có thể đọc dữ liệu từ Database

public List<SampleData> InitData()
        {
            List<SampleData> result = new List<SampleData>();
            result.Add(new SampleData() { Name = "Nguyen Van A", Email = "nva@gmail.com", Phone = "0938283", Address = "218 Hai Phong, Da Nang" });
            result.Add(new SampleData() { Name = "Nguyen Van B", Email = "nva@gmail.com", Phone = "8392832", Address = "189 Son Tra, Da Nang" });
            result.Add(new SampleData() { Name = "Nguyen Van C", Email = "nva@gmail.com", Phone = "9328928", Address = "98 Ngu Hanh Son, Da Nang" });
            result.Add(new SampleData() { Name = "Nguyen Van D", Email = "nva@gmail.com", Phone = "2517621", Address = "91 Bach Dang, Hai Chau, Da Nang" });
            result.Add(new SampleData() { Name = "Nguyen Van E", Email = "nva@gmail.com", Phone = "6903940", Address = "938 Cam Le, Da Nang" });
            return result;
        }

// GET: ClosedXML
        public ActionResult Index()
        {
            return View(InitData());
        }

//Export Action
        public ActionResult ExportExcel()
        {
            DataTable dt = new DataTable();
            dt.Columns.AddRange(new DataColumn[4] { new DataColumn("Name", typeof(string)),
            new DataColumn("Email", typeof(string)),
            new DataColumn("Phone",typeof(string)),
            new DataColumn("Address",typeof(string))});

            var result = InitData();
            foreach (var item in result)
            {
                dt.Rows.Add(item.Name, item.Email, item.Phone, item.Address);
            }
            //Exporting to Excel
            using (XLWorkbook wb = new XLWorkbook())
            {
                wb.Worksheets.Add(dt, "Customers");

                //wb.SaveAs(folderPath + "DataGridViewExport.xlsx");
                string myName = Server.UrlEncode("Test" + "_" + DateTime.Now.ToShortDateString() + ".xlsx");
                MemoryStream stream = GetStream(wb);// The method is defined below
                Response.Clear();
                Response.Buffer = true;
                Response.AddHeader("content-disposition", "attachment; filename=" + myName);
                Response.ContentType = "application/vnd.ms-excel";
                Response.BinaryWrite(stream.ToArray());
                Response.End();
            }

            return RedirectToAction("Index");
        }


        public MemoryStream GetStream(XLWorkbook excelWorkbook)
        {
            MemoryStream fs = new MemoryStream();
            excelWorkbook.SaveAs(fs);
            fs.Position = 0;
            return fs;
        }

 

3. Index.cshtml

@model List<ExportExcelAspNetMVC.Models.SampleData>
@{
    ViewBag.Title = "Home Page";
}

<h3>Export Excel With ClosedXML</h3>
@using (Html.BeginForm())
{
    @Html.AntiForgeryToken();
    <table class="table table-hover">
        <tr>
            <th>Name</th>
            <th>Email</th>
            <th>Phone</th>
            <th>Address</th>
        </tr>
        @foreach (var item in Model)
        {
            <tr>
                <td>@item.Name</td>
                <td>@item.Email</td>
                <td>@item.Phone</td>
                <td>@item.Address</td>
            </tr>
        }
    </table>
    <a href="/ClosedXML/ExportExcel" class="btn btn-primary">Export Excel</a>
}

Các bạn có thể tìm hiệu thêm về ClosedXML tại link: https://github.com/ClosedXML/ClosedXML

Hoặc download source code của ví dụ dưới đây

Download Source

Related Post


Xây dựng Autocomplete Textbox trong Asp.Net MVC với Jquery TypeHead
Saturday, July 8, 2017
Ở ví dụ này mình sẽ chia sẻ với các bạn về cách xây dựng tính năng Autocomplete Texbox trên Asp.Net MVC5 với JqueryTypeHead. Với sự hỗ trợ của JqueryTypeHead chúng ta có thể xây dựng được một tính năng gọi ý tìm kiếm nâng cao, cho phép với mỗi từ khóa người dùng gõ trên ô tìm kiếm, sẽ đưa ra được một danh sách gợi ý phân loại một cách rất trực quan và rõ ràng...
File Upload trong Asp.Net MVC sử dụng DropZone
Monday, July 3, 2017
Trước đây mình có làm một ví dụ tích hợp DropZone để xây dựng chức năng Upload Multiple File trong WebForm, hôm nay mình chia sẻ thêm một ví dụ về cách tích hợp DropZone vào Asp.Net MVC
Search
Category

Blog Archive

Đăng ký nhận bài mới