Note - Tips - Trick - .Net

Lưu các thủ thuật, code mẫu, cách dùng về .Net

Thao tác với Excel trong C# Thao tác với Excel trong C# Thao tác với Excel trong C# Thao tác với Excel trong C# Thao tác với Excel trong C# 4.7/5 (13 reviews)

Thao tác với Excel trong C#

Đã đăng 2017-12-15 14:15:56 bởi Kteam
7 bình luận 11665 lượt xem
Thao tác với Excel trong C# 4.7 /5 stars (3 reviews)
 

Dẫn nhập

Trong lập trình phần mềm, tool hay cả website. Việc thao tác với file dữ liệu rất cần thiết. Và thao tác với file Excel cũng chiếm tần suất không nhỏ.

Ở bài này, Kteam sẽ hướng dẫn tới bạn Thao tác với file Excel trong C# dùng thư viện EPPlus. EPPlus có một lợi thế là có thể chạy luôn cả ở phía Server.


Nội dung

Để đọc hiểu bài này tốt nhất bạn cần:

Bạn và Kteam sẽ cùng tìm hiểu những nội dung sau đây

  • Đọc file Excel trong C#
  • Ghi dữ liệu ra file Excel và định dạng Cell.

Đọc Excel trong C#

Đầu tiên, chúng ta mở Visual Studio và tạo một project mới

Chọn WPF APP(.NET Framework) hoặc Windows Forms App nếu bạn không rành WPF. Đặt tên project và chọn đường dẫn lưu solution của bạn.

Tại màn hình ban đầu của project.

Bạn thay cặp thẻ

<Grid>

</Grid>

Bằng

<StackPanel>

        <DataGrid Height="200" x:Name="dtgExcel"></DataGrid>

        <Button x:Name="btnImport" Click="btnImport_Click" Content="Import"></Button>

        <Button x:Name="btnExport" Click="btnExport_Click" Content="Export"></Button>

</StackPanel>

Chúng ta tạo giao diện có một DataGrid để hiển thị dữ liệu từ Excel và hai Button Import & Export.

Code hoàn chỉnh của MainWindow.xaml

<Window x:Class="ExcelInCsharp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:ExcelInCsharp"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <StackPanel>
        <DataGrid Height="200" x:Name="dtgExcel"></DataGrid>
        <Button x:Name="btnImport" Click="btnImport_Click" Content="Import"></Button>
        <Button x:Name="btnExport" Click="btnExport_Click" Content="Export"></Button>
    </StackPanel>
</Window>

Một lưu ý nhỏ, trong sự kiện Click mình đã tạo sẵn một Event Click theo cách nhắc lệnh mà Visual Studio hỗ trợ đó là:

Click = 

Một New Event Handler sẽ hiện lên > bạn chỉ cần nhấn Enter

Sẽ tự tạo một event ở code behind

Bạn nào đã có kiến thức WPF thì có thể bỏ qua. Bạn nào chưa biết có thể xem qua Serial LẬP TRÌNH WPF CƠ BẢN.

Đầu tiên, chúng ta sẽ thực hiện chức năng Import Excel. Code Behind như sau:

public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void btnImport_Click(object sender, RoutedEventArgs e)
        {

        }

        private void btnExport_Click(object sender, RoutedEventArgs e)
        {

        }
    }

Chúng ta sẽ bắt đầu Import thư viện EPPlus vào để dùng.

Cần 1 thư viện chính đó là EPPLus để thao tác với file Excel.

Mở tab Solution Explore > Nhấp chuột phải vào References > chọn Manage Nuget Packages

r

Trong tab Nuget mở ra. Chọn Browse và gõ từ khóa Selenium vào thanh Search. Install Selenium.WebDriverSelenium.Chrome.WebDriver hoặc Selenium.Firefox.WebDriver tùy theo trình duyệt bạn dùng.

Chúng ta cần một file excel mẫu để thử Import. Mình tạo sẵn 1 file excel có cấu trúc như sau trong folder Debug. Có tên là:

ImportData.xlsx

Và mình cũng tạo một class gọi là UserInfo để lưu dữ liệu chúng ta đọc được và để đổ dữ liệu lên DataGrid cho thuận tiện.

public class UserInfo
    {
        public string Name { get; set; }
        public DateTime Birthday { get; set; }
    }

Và trong Event btnImport_Click mình sẽ dán đoạn code có comment chi tiết sau và chạy kết quả. Giải thích chi tiết sẽ nói tới trong video hướng dẫn.

Khuyến cáo: dùng tài liệu trên website và video cùng lúc để đạt hiệu quả cao.

private void btnImport_Click(object sender, RoutedEventArgs e)
        {
            // tạo ra danh sách UserInfo rỗng để hứng dữ liệu.
            List<UserInfo> userList = new List<UserInfo>();
            try
            {
                // mở file excel
                var package = new ExcelPackage(new FileInfo("ImportData.xlsx"));

                // lấy ra sheet đầu tiên để thao tác
                ExcelWorksheet workSheet = package.Workbook.Worksheets[1];

                // duyệt tuần tự từ dòng thứ 2 đến dòng cuối cùng của file. lưu ý file excel bắt đầu từ số 1 không phải số 0
                for (int i = workSheet.Dimension.Start.Row + 1; i <= workSheet.Dimension.End.Row; i++)
                {
                    try
                    {
                        // biến j biểu thị cho một column trong file
                        int j = 1;

                        // lấy ra cột họ tên tương ứng giá trị tại vị trí [i, 1]. i lần đầu là 2
                        // tăng j lên 1 đơn vị sau khi thực hiện xong câu lệnh
                        string name = workSheet.Cells[i, j++].Value.ToString();

                        // lấy ra cột ngày sinh tương ứng giá trị tại vị trí [i, 2]. i lần đầu là 2
                        // tăng j lên 1 đơn vị sau khi thực hiện xong câu lệnh
                        // lấy ra giá trị ngày tháng và ép kiểu thành DateTime                      
                        var birthdayTemp = workSheet.Cells[i, j++].Value;
                        DateTime birthday = new DateTime();
                        if (birthdayTemp != null)
                        {
                            birthday = (DateTime)birthdayTemp;
                        }

                        /*                         

                        Đừng lười biến mà dùng đoạn code này sẽ gây ra lỗi nếu giá trị value không thỏa kiểu DateTime

                        DateTime birthday = (DateTime)workSheet.Cells[i, j++].Value;

                         */


                        // tạo UserInfo từ dữ liệu đã lấy được
                        UserInfo user = new UserInfo()
                        {
                           Name = name,
                           Birthday = birthday
                        };

                        // add UserInfo vào danh sách userList
                        userList.Add(user);

                    }
                    catch (Exception exe)
                    {

                    }
                }
            }
            catch (Exception ee)
            {
                MessageBox.Show("Error!");
            }

            dtgExcel.ItemsSource = userList;
        }

Chạy thử nhấn button Import và xem kết quả

Chúng ta thấy dữ liệu từ file excel đã được đọc lên và đổ vào DataGrid một cách dễ dàng.


Export data ra Excel

Để xuất dữ liệu ra file excel chúng ta dùng đoạn code mẫu sau đã comment rõ ràng và hướng dẫn chi tiết trong video hướng dẫn nhé! 


private void btnExport_Click(object sender, RoutedEventArgs e)
        {
            string filePath = "";
            // tạo SaveFileDialog để lưu file excel
            SaveFileDialog dialog = new SaveFileDialog();

            // chỉ lọc ra các file có định dạng Excel
            dialog.Filter = "Excel | *.xlsx | Excel 2003 | *.xls";

            // Nếu mở file và chọn nơi lưu file thành công sẽ lưu đường dẫn lại dùng
            if (dialog.ShowDialog() == true)
            {
                filePath = dialog.FileName;
            }

            // nếu đường dẫn null hoặc rỗng thì báo không hợp lệ và return hàm
            if (string.IsNullOrEmpty(filePath))
            {
                MessageBox.Show("Đường dẫn báo cáo không hợp lệ");
                return;
            }

            try
            {
                using (ExcelPackage p = new ExcelPackage())
                {
                    // đặt tên người tạo file
                    p.Workbook.Properties.Author = "Kteam by K9";

                    // đặt tiêu đề cho file
                    p.Workbook.Properties.Title = "Báo cáo thống kê";

                    //Tạo một sheet để làm việc trên đó
                    p.Workbook.Worksheets.Add("Kteam sheet");

                    // lấy sheet vừa add ra để thao tác
                    ExcelWorksheet ws = p.Workbook.Worksheets[1];

                    // đặt tên cho sheet
                    ws.Name = "Kteam sheet";
                    // fontsize mặc định cho cả sheet
                    ws.Cells.Style.Font.Size = 11; 
                    // font family mặc định cho cả sheet
                    ws.Cells.Style.Font.Name = "Calibri";

                    // Tạo danh sách các column header
                    string[] arrColumnHeader = {    
                                                "Họ tên",
                                                "Năm sinh"                                                
                };

                    // lấy ra số lượng cột cần dùng dựa vào số lượng header
                    var countColHeader = arrColumnHeader.Count();

                    // merge các column lại từ column 1 đến số column header
                    // gán giá trị cho cell vừa merge là Thống kê thông tni User Kteam
                    ws.Cells[1, 1].Value = "Thống kê thông tin User Kteam";
                    ws.Cells[1, 1, 1, countColHeader].Merge = true;
                    // in đậm
                    ws.Cells[1, 1, 1, countColHeader].Style.Font.Bold = true;
                    // căn giữa
                    ws.Cells[1, 1, 1, countColHeader].Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;

                    int colIndex = 1;
                    int rowIndex = 2;

                    //tạo các header từ column header đã tạo từ bên trên
                    foreach (var item in arrColumnHeader)
                    {
                        var cell = ws.Cells[rowIndex, colIndex];

                        //set màu thành gray
                        var fill = cell.Style.Fill;
                        fill.PatternType = ExcelFillStyle.Solid;
                        fill.BackgroundColor.SetColor(System.Drawing.Color.LightBlue);

                        //căn chỉnh các border
                        var border = cell.Style.Border;
                        border.Bottom.Style =
                            border.Top.Style =
                            border.Left.Style =
                            border.Right.Style = ExcelBorderStyle.Thin;

                        //gán giá trị
                        cell.Value = item;

                        colIndex++;
                    }

                    // lấy ra danh sách UserInfo từ ItemSource của DataGrid
                    List<UserInfo> userList = dtgExcel.ItemsSource.Cast<UserInfo>().ToList();

                    // với mỗi item trong danh sách sẽ ghi trên 1 dòng
                    foreach (var item in userList)
                    {
                        // bắt đầu ghi từ cột 1. Excel bắt đầu từ 1 không phải từ 0
                        colIndex = 1;

                        // rowIndex tương ứng từng dòng dữ liệu
                        rowIndex++;

                        //gán giá trị cho từng cell                      
                        ws.Cells[rowIndex, colIndex++].Value = item.Name;

                        // lưu ý phải .ToShortDateString để dữ liệu khi in ra Excel là ngày như ta vẫn thấy.Nếu không sẽ ra tổng số :v
                        ws.Cells[rowIndex, colIndex++].Value = item.Birthday.ToShortDateString();
                       
                    }                    

                    //Lưu file lại
                    Byte[] bin = p.GetAsByteArray();
                    File.WriteAllBytes(filePath, bin);
                }
                MessageBox.Show("Xuất excel thành công!");
            }
            catch (Exception EE)
            {
                MessageBox.Show("Có lỗi khi lưu file!");
            }
        }

Chúng ta thêm 1 giá trị trong DataGrid và nhấn Export.

Chọn nơi cần lưu file

Cùng xem kết quả nào! 

 

Vậy là bạn đã nắm được cách thao tác với file Excel một cách dễ dàng. Thật đơn giản đúng không nào.


Source code tham khảo 

Source code mẫu đi kèm bài viết, giúp bạn dễ dàng thao tác theo hướng dẫn và tham khảo tốt hơn.

ExcelInCSharp


Kết luận

Bài viết này đã sơ lược cho các bạn Cách thao tác với Excel trong C#.

Cảm ơn bạn đã theo dõi bài viết. Hãy để lại bình luận hoặc góp ý của mình để phát triển bài viết tốt hơn. Đừng quyên “Luyện tập – Thử thách – Không ngại khó”.



Tài liệu 

Bài hướng dẫn này là một trong những CHIẾN DỊCH được phổ biến bởi Howkteam.com và sự đóng góp từ cộng đồng. Bạn có thể cùng mọi người yêu cầu và tài trợ để Kteam tạo ra nhiều khóa học hữu ích hơn nữa.

Truy cập và tìm hiểu chi tiết tại: 

www.howkteam.vn/requests 

Ngoài ra, Kteam hỗ trợ tính năng lưu trữ nội dung bài THAO TÁC VỚI EXCEL TRONG C# dưới dạng file PDF trong link bên dưới.

Đừng quên like hoặc +1 Google để ủng hộ Kteam và tác giả nhé! 


Thảo luận

Nếu bạn có bất kỳ khó khăn hay thắc mắc gì về khóa học, đừng ngần ngại đặt câu hỏi trong phần BÌNH LUẬN bên dưới hoặc trong mục HỎI & ĐÁP trên thư viện Howkteam.com để nhận được sự hỗ trợ từ cộng đồng. 

 

Chia sẻ:
Thảo luận Hỏi và đáp Báo lỗi bài viết
Hủy bỏ   hoặc  
Thao tác với Excel trong C#
Dinh Tona 2017-12-20 13:37:57

Cách này sử dụng 2 vòng for có thực sự nhanh không vậy aLong

1 bình chọn
Reply
Thao tác với Excel trong C#
liamlee911 2017-12-17 23:26:15

      Chạy code không lỗi, không hiển thị nội dung, mong admin xem giúp.

public class BarInfo
        {
            public string NameOfBar { get; set; }
            public string NameOfPerson1 { get; set; }
        }
        #endregion

        private void btnImportExcel_Click(object sender, EventArgs e)
        {
            //test bằng nút này
            List<BarInfo> barInfo = new List<BarInfo>();
            try
            {
                var package = new ExcelPackage(new FileInfo("ImportData.xlsx"));
                ExcelWorksheet workSheet = package.Workbook.Worksheets[1];
                for (int i = workSheet.Dimension.Rows + 1; i <= workSheet.Dimension.End.Row; i++)
                {
                    try
                    {
                        int j = 1;
                        string nameOfBar = workSheet.Cells[i, j++].Value.ToString();
                        string nameOfPerson1 = workSheet.Cells[i, j++].Value.ToString();
                        BarInfo bar = new BarInfo()
                        {
                            NameOfBar = nameOfBar,
                            NameOfPerson1 = nameOfPerson1
                        };
                        barInfo.Add(bar);
                    }
                    catch(Exception exe)
                    {

                    }
                }
            }
            catch (Exception  exe)
            {
                MessageBox.Show("error");
            }
            dgvBarTin.DataSource = barInfo;

1 bình chọn
Reply
Thao tác với Excel trong C#
liamlee911 2017-12-17 22:47:04

Trên winform không bị lỗi mà nó ố hiển thị nội dung ra.

0 bình chọn
Reply
View all 2 comments
Kteam - Howkteam Free Education
K9 2017-12-18 22:49:24
bạn dùng DataGridView của winform chứ bạn
0 bình chọn
Reply
Kteam - Howkteam Free Education
liamlee911 2017-12-18 23:10:17
Mình dùng DataGridView mà, tên là dgvBartin đó.
0 bình chọn
Reply
Thao tác với Excel trong C#
huy202ps 2017-12-16 07:29:19

bạn ơi... cho mình hỏi sau khi thêm dữ liệu vào DataGrid sau đó làm sao chuyển dữ liệu đó vào SQL server ....cám ơn bạn...

bạn có thể làm thêm bài hướng dẫn không ....cám ơn bạn

1 bình chọn
Reply
View all 1 comments
Kteam - Howkteam Free Education
K9 2017-12-16 13:14:17
bạn lấy ra được danh sách rồi. thì add nó từ từ vào
0 bình chọn
Reply
Hủy bỏ   hoặc  
Hủy bỏ   hoặc  

Chiến dịch

Kteam - Howkteam Free Education