Đang tải...

Trung Lê Thành

Trung IT


17

C#(.NET) - Tương tác với file Excel

Trung Lê Thành
Trung Lê Thành

5 năm trước · 5 phút đọc

Lời Ngỏ

Chào mọi người, trong một lần làm việc và được yêu cầu làm một tính năng X và sử dụng thư viện Microsoft.Office.Interop.Excel để thực hiện tương tác với file excel. Dưới đây là cách mình áp dụng thư viện Interop Excel vào để giảm tải thao tác trên phần mềm.

Picture3.png

Nội Dung

1. Giới thiệu

Microsoft.Office.Interop.Excel là một thư viện giúp bạn có thể tương tác với các file *.xls, *xlsx - Excel. Với thư viện trên bạn có thể:

  • Mở file => Lấy dữ liệu ra => Đóng file lại.
  • Tạo một file mới => Thêm dữ liệu => Đóng file lại.

Ủa vậy có gì hay ho đâu ông lìn này, Tui mở phần mềm excel lên tự làm cho nhanh. Comedown come down~~. Bạn đọc hết đi đã chưa gì mà nóng rầu.

Chi tiết xem tại trang chủ tại đây.

2. Ứng dụng

2.1. Import dữ liệu

Đặt vấn đề: Công ty TNHH TT có một cơ sở dữ liệu SQL Server(csdl) dbHotGirl và thực hiện áp dụng công nghệ để quản lý khách hàng thân thiết. Tuy nhiên dữ liệu cũ của họ là một file excel với 101 khách hàng thân thiết. Công ty muốn có tính năng import dữ liệu từ file excel lên cơ sở dữ liệu của công ty. Theo bạn, bạn sẽ áp dụng cách nào?

Ối giời, thì tui sẽ lên tìm "How to import data from an excel file into sql server" - trên stackoverflow => Cách hay nè => Giả sử, nếu công ty muốn làm thành một tính cho nhân viên họ dùng thì sao?

Giải pháp: Sử dụng Microsoft.Office.Interop.Excel.dll đọc dữ liệu sau đó thực hiện yêu cầu.

2.2. Export dữ liệu

Đặt vấn đề: Công ty TNHH TT, mong muốn có thêm tính năng xuất thống kê doanh số bán hàng lưu dưới dạng excel.

Giải pháp: Sử dụng Microsoft.Office.Interop.Excel và csdl để thực hiện yêu cầu.

3. Thực hiện yêu cầu số 1

3.1. Đặt vấn đề

Từ File excel có sẵn thực hiện tính năng sau:

  • Đọc file excel và lưu nó thành DataTable.
  • Xuất ra danh sách các số điện thoại nhà mạng Viettel và có địa chỉ thuộc TP. Vũng Tàu.

Chuẩn bị file excel để test:

image.png

Tải file excel mẫu tại đây.

3.2. Tạo project - dự án mới - ExcelApp

Giao diện chính:

Theo bạn, việc gán sự kiện mặc định bằng cách double click control hay viết code rồi liên kết sau? Mình theo trường phái thứ 2! Còn bạn?

Giao diện chính của phần mềm

Thông số các control như bảng dưới đây:

STT Control name Properties Event name
1 Label text: "Excel Application"
2 Button - btnOpenFile text: "Open File" btnOpenFile_Click
3 Button - btnExportFile text: "Export File" btnExportFile_Click

3.3. Trong file Form1.cs ta xây dựng cấu trúc chương trình

Mục đích của việc dưới đây giúp code đẹp, rõ ràng dễ hiểu.

image.png

Công dụng của "#region và #endregion" là gom nhóm code bạn lại.

Tiếp theo trong nhóm "Variables & Properties" thêm biến như sau:

private string pathFile = "";//save path of file excel

3.4. Trong file Form1.cs tạo sự kiện cho 2 Button

Để gán sự kiện bằng code ta thực hiện như sau: <Tên Control> += <Tên sự kiện/ method> trong Contrustor Form1().

Ví dụ: btnOpenFile.Click += btnOpenFile_Click;

3.5. Trong file Form1.cs tạo method ProcessOpenFile

Tại đây, bạn tạo một method logic như sau:

private void ProcessOpenFile()
{
       OpenFileDialog choofdlog = new OpenFileDialog();
            choofdlog.Filter = "Just file *.xlsx|*.xlsx";
            choofdlog.FilterIndex = 1;
            if (choofdlog.ShowDialog() == DialogResult.OK)
                pathFile = choofdlog.FileName;
            else
                pathFile = string.Empty;
}

3.6. Thêm thư viện Microsoft.Office.Interop.Excel

Trong Solution Explorer (Ctrl + Alt +L) => chuột phải vào References => Add References như hình:

image.png

Nhập tên "Excel" như hình dưới đây => OK

image.png

Nếu bạn tìm không ra thư viện trên thì bạn mở "Visual Studio Installer" cài thêm Office/ Point development

image.png

3.7. Trong file Form1.cs tạo method ReadXcel

Tại đây, nhu cầu của mình là muốn lấy dữ liệu và đẩy nó vào DataTable => Kiểu dữ liệu trả về là DataTable và có hai tham số truyền vào là đường dẫn chứa file excel (path), tên trang tính (sheetName).

Để tương tác với file Excel bạn cần tạo 3 đối tượng:

  • Microsoft.Office.Interop.Excel.Application
  • Microsoft.Office.Interop.Excel.Workbook => Lưu trữ Workbook.
  • Microsoft.Office.Interop.Excel.Worksheet => Lưu trữ Worksheet - trang tính.
Microsoft.Office.Interop.Excel.Application objXL = null;
Microsoft.Office.Interop.Excel.Workbook objWB = null;
objXL = new Microsoft.Office.Interop.Excel.Application();
objWB = objXL.Workbooks.Open(path);
Microsoft.Office.Interop.Excel.Worksheet objSHT = objWB.Worksheets[sheetName];

Tiếp theo, bạn cần tìm ra số cột và hàng cuối cùng chứa dữ liệu.

int rows = objSHT.UsedRange.Rows.Count;
int cols = objSHT.UsedRange.Columns.Count;

Ở phần sau mình sẽ chỉ bạn tối ưu chỗ tìm cột và hàng này nhé.

Tiếp theo, bạn cần tạo đối tượng DataTable (dtResult) => Đọc dòng đầu tiên => Lấy ra nội dung lưu thành từng cột cho biến dtResult => Sử dụng vòng lặp xử lý nhé.

for (int c = 1; c <= cols; c++)
 {
      string colname = objSHT.Cells[1, c].Text;
      dtResult.Columns.Add(colname);               
}

Sau khi thêm các cột phía trên bạn thêm một bước "Xác định loại dữ liệu cho cột". Các bạn thao tác như sau: <DataTable>.Columns[<Index Cột>].DataType = typeof(<Loại dữ liệu>);

Ví dụ:dtResult.Columns[0].DataType = typeof(int); các cột còn lại tương tự nhé.

Tiếp theo dùng vòng lặp để lấy dữ liệu của từng dòng ra.

for (int r = 2; r <= rows; r++)
{
        DataRow dr = dtResult.NewRow();
        for (int c = 1; c <= cols; c++)
        {
            dr[c - 1] = objSHT.Cells[r, c].Text;
        }                
        dtResult.Rows.Add(dr);
}

Khi đọc xong, bạn cần thêm một bước là đóng file. Mở ra thì phải đóng lại => Trả về kết quả cho hàm ReadXcel.

objWB.Close(); // Đóng  Workbook.
objXL.Quit(); // Đóng phần mềm Excel.
return dtResult;

4. Thực hiện yêu cầu số 2 (Còn tiếp......)

Lời kết

Trên đây là cách mình thực hiện tương tác với file excel. Nếu bài viết có sai sót, bạn hãy phản hồi lại cho mình nhé. Cảm ơn bạn đã theo dõi bài viết.

#TT