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é
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:
- Google Drive: https://drive.google.com/open?id=0BwkqvOGy58rBUlZ0YzdvRlhqODQ
- Dropbox: https://www.dropbox.com/s/h6dptx3sonmtoot/NPOI_EXCEL.zip?dl=0
Cám ơn các bạn đã quan tâm!