Tiếp theo phần 1, thì phần này mình sẽ hướng dẫn các bạn thao tác với các công thức trong Excel, cũng như đọc nội dung từ file Excel.
Thêm formula vào các ô trong Excel
Tương tự như Excel, chúng ta có thể dễ dàng gọi các formula như sau :
// Thực hiện tính theo formula trong excel // Hàm Sum worksheet.Cells[listItems.Count + 3, 3].Value = "Total is :"; worksheet.Cells[listItems.Count + 3, 4].Formula = "SUM(D2:D" + (listItems.Count + 1) + ")"; // Hàm SumIf worksheet.Cells[listItems.Count + 4, 3].Value = "Greater than 20050 :"; worksheet.Cells[listItems.Count + 4, 4].Formula = "SUMIF(D2:D" + (listItems.Count + 1) + ",\">20050\")"; // Tinh theo % worksheet.Cells[listItems.Count + 5, 3].Value = "Percentatge: "; worksheet.Cells[listItems.Count + 5, 4].Style.Numberformat.Format = "0.00%"; // Dòng này có nghĩa là ở column hiện tại lấy với địa chỉ (Row hiện tại - 1)/ (Row hiện tại - 2) trong cùng một colum worksheet.Cells[listItems.Count + 5, 4].FormulaR1C1 = "(R[-1]C/R[-2]C)";
Khá là dễ dàng phải không nào 😀
Đọc nội dung từ file Excel
Tiếp sau đây mình sẽ hướng dẫn các bạn cách lấy data từ file excel và đưa lên web theo cách đơn giản nhất.
Bước 1. Viết hàm ReadFromExcelFile
private DataTable ReadFromExcelfile(string path, string sheetName) { // Khởi tạo data table DataTable dt = new DataTable(); // Load file excel và các setting ban đầu using (ExcelPackage package = new ExcelPackage(new FileInfo(path))) { if (package.Workbook.Worksheets.Count < 1) { // Log - Không có sheet nào tồn tại trong file excel của bạn return null; } // Lấy Sheet đầu tiện trong file Excel để truy vấn // Truyền vào name của Sheet để lấy ra sheet cần, nếu name = null thì lấy sheet đầu tiên ExcelWorksheet workSheet = package.Workbook.Worksheets.FirstOrDefault(x => x.Name == sheetName) ?? package.Workbook.Worksheets.FirstOrDefault(); // Đọc tất cả các header foreach (var firstRowCell in workSheet.Cells[1, 1, 1, workSheet.Dimension.End.Column]) { dt.Columns.Add(firstRowCell.Text); } // Đọc tất cả data bắt đầu từ row thứ 2 for (var rowNumber = 2; rowNumber <= workSheet.Dimension.End.Row; rowNumber++) { // Lấy 1 row trong excel để truy vấn var row = workSheet.Cells[rowNumber, 1, rowNumber, workSheet.Dimension.End.Column]; // tạo 1 row trong data table var newRow = dt.NewRow(); foreach (var cell in row) { newRow[cell.Start.Column - 1] = cell.Text; } dt.Rows.Add(newRow); } } return dt; }
Lưu ý, trong ví dụ trên mình dùng workSheet.Dimension. Nó sẽ đọc tất cả các dòng và các cột đã được bind trong excel nên nếu bạn có dư nhưng dòng trắng không cần thiêt nó cũng sẽ đọc luôn. Nó sẽ lấy tới vị trí từ A1:D20 luôn nhé :D. Nếu các bạn không thích dùng cách này thì có thể pass 1 param vào hàm ReadFromExcelFile như numberOfColumn , chỉ lấy một số cột chứ không lấy toàn bộ nhé.
Bước 2. Thêm hàm ReadFromExcel trong HomeController
[HttpGet] public ActionResult ReadFromExcel() { var data = ReadFromExcelfile(@"D:\ExcelDemo.xlsx", "First Sheet"); return View(data); }
@{ Layout = null; } <html> <head> <meta name="viewport" content="width=device-width" /> <title>ReadFromExcel</title> </head> <body> <div> <table border="1" cellpadding="5"> <thead> <tr> @foreach (System.Data.DataColumn col in Model.Columns) { <th>@col.Caption</th> } </tr> </thead> <tbody> @foreach(System.Data.DataRow row in Model.Rows) { <tr> @foreach (var cell in row.ItemArray) { <td>@cell.ToString()</td> } </tr> } </tbody> </table> </div> </body> </html>
Để xem kết quả, các bạn vào đường dẫn /Home/ReadFromExcel/ nhé.
Qua 2 phần của bài viết, bạn đã có cái nhìn tổng quát về EPPlus và một số cách sử dụng cơ bản của thư viện này. Nếu có thắc mắc gì, các bạn cứ post vào mục comment nhé.
Xin chào bạn!
Mình đang viết code C# để trích xuất dữ liệu từ 2 file excel để ra các file excel theo mẫu có sẵn và đã làm được. Tuy nhiên, vì sử dụng mẫu nên file kết quả bị thừa ra một số dòng (ví dụ: danh sách theo mẫu là 200 nhưng mình chỉ làm ngang 50 thôi) thì có cách nào để mình xóa đi các dòng trống đó không vì ở cuối còn thêm 1 số thông tin khác nữa.
Rất cảm ơn
LikeLike
có chứ bạn… vì các rows là bạn for mà thêm vào mà… h bạn chỉ lấy 50 dòng đầu tiên bind vào excel thôi. còn các thông tin khác bạn có thể tính trên tất cả rồi display trong file excel theo chỗ bạn muốn cũng oke mà….
Fb mình đây: nếu như vẫn ko hiểu thì cứ pm fb mình nhé 🙂
FB:https://www.facebook.com/Hanker2403
LikeLike
Cái này có đọc được từ file csv ko bạn?
LikeLike