C#: Đọc và viết ra file Excel (xls, xlsx) sử dụng NPOI

C#: Đọc và viết ra file Excel (xls, xlsx) sử dụng NPOI

Chào các bạn,

Đối với C#, ta có rất là nhiều libraries khác nhau để đọc và viết ra file Excel, nhưng một trong những lib free và mạnh mẽ đó chính là NPOI.

Nay mình sẽ hướng dẫn các bạn cài đặt cũng như là cách đọc + viết ra file Excel cơ bản nhé 😀

1/ Cài đặt library NPOI

Ta có thể cài đặt NPOI thông qua Nuget thông qua Package Manager Console với câu lệnh:

Install-Package NPOI

Hoặc ta cũng có thể chuột phải vào Project như hình để mở Nuget:

Và sau đó qua mục Browse, tìm NPOI và cài đặt:

Chỉ như vậy thôi là ta đã có thể sử dụng NPOI để thực hiện mục đích rồi 😀

2/ Dùng NPOI để đọc file Excel

Mình sẽ dùng data mặc định như sau cho cà 2 file .xls và .xlsx nhé

C#: Đọc và viết ra file Excel

Và bây giờ để đọc được file này, rất đơn giản như sau, để đọc XLS, ta dùng class HSSF:

// Lấy stream file
            FileStream fs = new FileStream(@"E:\testwb.xls", FileMode.Open);

            // Khởi tạo workbook để đọc
            HSSFWorkbook wb = new HSSFWorkbook(fs);

            // Lấy sheet đầu tiên
            ISheet sheet = wb.GetSheetAt(0);

            // đọc sheet này bắt đầu từ row 2 (0, 1 bỏ vì tiêu đề)
            int rowIndex = 2;

            // xuất thong báo
            Console.OutputEncoding = Encoding.UTF8; // để xuất ra console tv có dấu
            Console.WriteLine("Thông tin SV từ file Excel");

            // nếu vẫn chưa gặp end thì vẫn lấy data
            while(sheet.GetRow(rowIndex).GetCell(0).StringCellValue.ToLower() != "end")
            {
                // lấy row hiện tại
                var nowRow = sheet.GetRow(rowIndex);

                // vì ta dùng 3 cột A, B, C => data của ta sẽ như sau
                var MSSV = nowRow.GetCell(0).StringCellValue;
                var Name = nowRow.GetCell(1).StringCellValue;
                var Phone = nowRow.GetCell(2).StringCellValue;

                // Xuất ra thông tin lên màn hình
                Console.WriteLine("MSSV: {0} | Họ & Tên: {1} | SDT: {2}", MSSV, Name, Phone);

                // tăng index khi lấy xong
                rowIndex++;
            }

Cũng chỉ là khởi tạo rồi đọc dần thôi :D, tương tự để đọc được XLSX, ta dùng XSSF:

// Lấy stream file
            FileStream fs = new FileStream(@"E:\testwb.xlsx", FileMode.Open);

            // Khởi tạo workbook để đọc
            XSSFWorkbook wb = new XSSFWorkbook(fs);

            // Lấy sheet đầu tiên
            ISheet sheet = wb.GetSheetAt(0);

            // đọc sheet này bắt đầu từ row 2 (0, 1 bỏ vì tiêu đề)
            int rowIndex = 2;

            // xuất thong báo
            Console.OutputEncoding = Encoding.UTF8; // để xuất ra console tv có dấu
            Console.WriteLine("Thông tin SV từ file Excel XLSX");

            // nếu vẫn chưa gặp end thì vẫn lấy data
            while (sheet.GetRow(rowIndex).GetCell(0).StringCellValue.ToLower() != "end")
            {
                // lấy row hiện tại
                var nowRow = sheet.GetRow(rowIndex);

                // vì ta dùng 3 cột A, B, C => data của ta sẽ như sau
                var MSSV = nowRow.GetCell(0).StringCellValue;
                var Name = nowRow.GetCell(1).StringCellValue;
                var Phone = nowRow.GetCell(2).StringCellValue;

                // Xuất ra thông tin lên màn hình
                Console.WriteLine("MSSV: {0} | Họ & Tên: {1} | SDT: {2}", MSSV, Name, Phone);

                // tăng index khi lấy xong
                rowIndex++;
            }

2 thằng sử dụng y hệt nhau thôi các bạn, nên hãy nhớ:

  • XSSF => dùng cho XLSX (Excel 2007+)
  • HSSF => dùng cho XLS (Excel 97-2003)

3/ Dùng NPOI để viết ra file Excel

Ví dụ đây là danh sách mình cần ghi zô File Excel

// Danh sách SV
            List<SinhVien> list = new List<SinhVien>()
            {
                new SinhVien{ MSSV = "15211TT00xx", Name = "Trần Minh Phát", Phone = "090999xxxx" },
                new SinhVien{ MSSV = "15211TT00xx", Name = "Võ Phương Quân", Phone = "090999xxxx" },
                new SinhVien{ MSSV = "15211TT00xx", Name = "Lê Bảo Long", Phone = "090999xxxx" },
                new SinhVien{ MSSV = "15211TT00xx", Name = "Nguyễn Trung Hiếu", Phone = "090999xxxx" },
            };

Vậy mình sẽ tạo lần lượt file excel như sau thông qua XSSF(HSSF tương tự):

// Danh sách SV
            List<SinhVien> list = new List<SinhVien>()
            {
                new SinhVien{ MSSV = "15211TT00xx", Name = "Trần Minh Phát", Phone = "090999xxxx" },
                new SinhVien{ MSSV = "15211TT00xx", Name = "Võ Phương Quân", Phone = "090999xxxx" },
                new SinhVien{ MSSV = "15211TT00xx", Name = "Lê Bảo Long", Phone = "090999xxxx" },
                new SinhVien{ MSSV = "15211TT00xx", Name = "Nguyễn Trung Hiếu", Phone = "090999xxxx" },
            };

            // khởi tạo wb rỗng
            XSSFWorkbook wb = new XSSFWorkbook();

            // Tạo ra 1 sheet
            ISheet sheet = wb.CreateSheet();

            // Bắt đầu ghi lên sheet

            // Tạo row
            var row0 = sheet.CreateRow(0);
            // Merge lại row đầu 3 cột
            row0.CreateCell(0); // tạo ra cell trc khi merge
            CellRangeAddress cellMerge = new CellRangeAddress(0, 0, 0, 2);
            sheet.AddMergedRegion(cellMerge);
            row0.GetCell(0).SetCellValue("Thông tin sinh viên");

            // Ghi tên cột ở row 1
            var row1 = sheet.CreateRow(1);
            row1.CreateCell(0).SetCellValue("MSSV");
            row1.CreateCell(1).SetCellValue("Tên");
            row1.CreateCell(2).SetCellValue("Phone");

            // bắt đầu duyệt mảng và ghi tiếp tục
            int rowIndex = 2;
            foreach (var item in list)
            {
                // tao row mới
                var newRow = sheet.CreateRow(rowIndex);

                // set giá trị
                newRow.CreateCell(0).SetCellValue(item.MSSV);
                newRow.CreateCell(1).SetCellValue(item.Name);
                newRow.CreateCell(2).SetCellValue(item.Phone);

                // tăng index
                rowIndex++;
            }

            // xong hết thì save file lại
            FileStream fs = new FileStream(@"E:\sinhvien.xlsx", FileMode.CreateNew);
            wb.Write(fs);

Vẫn lần lượt theo tuần tự cực dễ nghen :D, kết quả như sau khi chạy:

Còn về style cho nó thì các bạn cứ dần dần tìm hiểu nhé 😀

Tải về bộ code demo tại:

Cám ơn các bạn đã quan tâm!

facebook
Seth Phát

Seth Phát

Mình là Phát - biệt danh Seth Phát. Hiện đang là một Sr. Full-Stack Engineer. Mình là một người yêu thích và đam mê lập trình và hiện tại đang theo về phần Web là chủ yếu. Mạnh Back-end và khá Front-end, vẫn đang theo đều cả 2 :v. Còn gì bằng khi được làm những thứ mà mình yêu thích, đam mê ;)

Bình luận qua Facebook