Series C# hay ho: EPPlus – Thư viện Excel “bá đạo” – Phần 2

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é.

demo3

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é.

Advertisements

2 thoughts on “Series C# hay ho: EPPlus – Thư viện Excel “bá đạo” – Phần 2”

  1. 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

    Like

    1. 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

      Like

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s