NEWS

[C#] Hướng dẫn xuất dữ liệu từ data ra file Excel template sử dụng Epplus

[C#] Hướng dẫn xuất dữ liệu từ data ra file Excel template sử dụng Epplus
Đăng bởi: Thảo Meo - Lượt xem: 21086 09:56:30, 02/12/2020C#   In bài viết

Xin chào các bạn, bài viết hôm nay mình sẻ hướng dẫn các bạn cách xuất dữ liệu từ Data ra file Excel mẫu Template sử dụng thư viện Epplus C# Winform.

[C#] Export Data to Excel Template using Epplus Winform

Dưới đây, mình có một mẫu hóa đơn bán lẽ như hình bên dưới:

template_hoadon

Ở hình trên các bạn thấy, tên Filed mình đang bao bọc bởi cặp dấu "{}", các bạn có thể thay đổi cặp dấu này thành %, #, $ hay ký hiệu gì tùy bạn nhé.

sysbol_csharp

Lúc gọi hàm ở FillReport, các bạn truyền thêm ký tự này vào trong hàm.

Ở hình demo xuất dữ liệu ra hóa đơn trên mình: Sử dụng 2 datatable.

  1. Table "info"
  2. Table "productDetails"

Ở table Info là từng dòng đơn nên mình ghi ký hiệu tên {info.tencuahang} 

Còn ở phần danh sách list sản phẩm sách tin học, các bạn khai báo Define Name trong excel hình hình mình bên dưới.

excel_template

P/s: các bạn nhớ đặt tên Define Name giống tên Table mình khai báo ở trong code nhé.

Và Dưới đây là kết quả khi chúng ta chạy ứng dụng đổ dữ liệu vào Excel Template C#

excel_epplus

Video demo ứng dụng: 

Đầu tiên, các bạn tạo cho mình một class: TemplateExcel.cs 

using OfficeOpenXml;
using OfficeOpenXml.FormulaParsing.Excel.Functions.RefAndLookup;
using OfficeOpenXml.Table;
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ExportExcelToTemplateEpplus
{
    public class TemplateExcel
    {
        public static void FillReport(string filename, string templatefilename, DataSet data)
        {
            FillReport(filename, templatefilename, data, new string[] { "%", "%" });
        }

        public static void FillReport(string filename, string templatefilename, DataSet data, string[] deliminator)
        {
            if (File.Exists(filename))
                File.Delete(filename);

            using (var file = new FileStream(filename, FileMode.CreateNew))
            {
                using (var temp = new FileStream(templatefilename, FileMode.Open))
                {
                    using (var xls = new ExcelPackage(file, temp))
                    {                        
                        foreach (var n in xls.Workbook.Names)
                        {
                            FillWorksheetData(data, n.Worksheet, n, deliminator);
                        }
                       
                        foreach (var ws in xls.Workbook.Worksheets)
                        {
                            foreach (var n in ws.Names)
                            {
                                FillWorksheetData(data, ws, n, deliminator);
                            }
                        }
                     
                        foreach (var ws in xls.Workbook.Worksheets)
                        {
                            foreach (var c in ws.Cells)
                            {
                                var s = "" + c.Value;
                                if (s.StartsWith(deliminator[0]) == false &&
                                    s.EndsWith(deliminator[1]) == false)
                                    continue;
                                s = s.Replace(deliminator[0], "").Replace(deliminator[1], "");
                                var ss = s.Split('.');
                                try
                                {
                                    c.Value = data.Tables[ss[0]].Rows[0][ss[1]];
                                }
                                catch { }
                            }
                        }

                        xls.Save();
                    }
                }
            }
        }

        private static void FillWorksheetData(DataSet data, ExcelWorksheet ws, ExcelNamedRange n, string[] deliminator)
        {          
            if (data.Tables.Contains(n.Name) == false)
                return;

            var dt = data.Tables[n.Name];

            int row = n.Start.Row;

            var cn = new string[n.Columns];
            var st = new int[n.Columns];
            for (int i = 0; i < n.Columns; i++)
            {
                cn[i] = (n.Value as object[,])[0, i].ToString().Replace(deliminator[0], "").Replace(deliminator[1], "");
                if (cn[i].Contains("."))
                    cn[i] = cn[i].Split('.')[1];
                st[i] = ws.Cells[row, n.Start.Column + i].StyleID;
            }

            foreach (DataRow r in dt.Rows)
            {
                for (int col = 0; col < n.Columns; col++)
                {
                    if (dt.Columns.Contains(cn[col]))
                        ws.Cells[row, n.Start.Column + col].Value = r[cn[col]]; 
                    ws.Cells[row, n.Start.Column + col].StyleID = st[col]; 
                }
                row++;
            }

            // extend table formatting range to all rows
            foreach (var t in ws.Tables)
            {
                var a = t.Address;
                if (n.Start.Row.Between(a.Start.Row, a.End.Row) &&
                    n.Start.Column.Between(a.Start.Column, a.End.Column))
                {
                    ExtendRows(t, dt.Rows.Count - 1);
                }
                   
            }
        }
        public static void ExtendRows(ExcelTable excelTable, int count)
        {
            
            var ad = new ExcelAddress(excelTable.Address.Start.Row,
                                      excelTable.Address.Start.Column,
                                      excelTable.Address.End.Row + count,
                                      excelTable.Address.End.Column);
            //Address = ad;
        }
    }

    public static class int_between
    {
        public static bool Between(this int v, int a, int b)
        {
            return v >= a && v <= b;
        }
    }
}

Và dưới đây là code sử dụng export dữ liệu ra file mẫu Excel:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace ExportExcelToTemplateEpplus
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void btnExport_Click(object sender, EventArgs e)
        {
            var product = new DataTable();
            product.Columns.Add("tenhang", typeof(string));
            product.Columns.Add("soluong", typeof(int));
            product.Columns.Add("dongia", typeof(int));
            product.Rows.Add("Kỷ thuật lập trình C#", 5, 55000);
            product.Rows.Add("Cơ sở dữ liệu và thuật toán", 3, 15000);
            product.Rows.Add("Giáo trình Photoshop", 20, 65000);
            product.Rows.Add("Triết học", 7, 15000);
            product.Rows.Add("Lập trình mạng Cisco", 2, 21000);
            product.Rows.Add("Làm chủ Microsoft Office 2019", 3, 89000);
            product.Rows.Add("Lập trình hướng đối tượng JAVA", 1, 150000);
            product.Rows.Add("Giáo trình Android/IOS", 8, 90000);        
            product.TableName = "productdetails";

            var info = new DataTable();
            info.Columns.Add("tencuahang");
            info.Columns.Add("diachi");
            info.Columns.Add("tenkhachhang");
            info.Columns.Add("diachikhachhang");
            info.Columns.Add("ngaythang");
            info.Columns.Add("dienthoai");
            info.Rows.Add("NHÀ SÁCH TIN HỌC VB.NET", "Địa chỉ: 05/27 Trung Thành, Quảng Thành, Châu Đức, BRVT", "Tên khách hàng: Nguyễn Thảo", "Địa chỉ: Biên Hòa - Đồng Nai", "Biên Hòa, Ngày 02 tháng 12 năm 2020", "Điện thoại: 0933.913.122");
            info.TableName = "info";
            var ds = new DataSet();
            ds.Tables.Add(product);
            ds.Tables.Add(info);
            TemplateExcel.FillReport("invoice.xlsx", "template.xlsx", ds, new string[] { "{","}"});
            Process.Start("invoice.xlsx");
        }
    }
}

Thanks for watching!

DOWNLOAD SOURCE

THÔNG TIN TÁC GIẢ

BÀI VIẾT LIÊN QUAN

[C#] Hướng dẫn xuất dữ liệu từ data ra file Excel template sử dụng Epplus
Đăng bởi: Thảo Meo - Lượt xem: 21086 09:56:30, 02/12/2020C#   In bài viết

CÁC BÀI CÙNG CHỦ ĐỀ

Đọc tiếp
.