08/04/2014

Kết xuất dữ liệu từ DataGridView ra file Excel

Khi bạn đã biết xử lý và hiển thị dữ liệu trên DataGridView, yêu cầu sau cùng là việc kết xuất dữ liệu ra tệp tin để in ấn hoặc lưu trữ. Kết xuất dữ liệu từ DataGridView ra tệp Excel là một trong những vấn đề được nhiều bạn quan tâm. Vậy bài viết này tôi trình bày cách để các bạn có thể làm được điều đó.
Giả sử bạn cần kết xuất dữ liệu ra 1 tệp Excel có định dạng như sau (Đơn giản để các bạn dễ hình dung):
Tệp Excel mẫu
Vậy bạn cần thiết kế giao diện Form tương tự như sau:
Giao diện mẫu
Lưu ý: Trong DataGridView trên có 1 cột mã đơn vị ẩn đi.

Việc hiển thị dữ liệu và thao tác trên DataGridView trong bài này mặc nhiên là bạn đã biết. Nếu chưa biết bạn có thể tham khảo các bài trước đó tôi đã trình bày để có được dữ liệu như trên.

Bây giờ khi tôi nhấn nút kết xuất thì dữ liệu trong DataGridView được chuyển qua tệp Excel. Vậy cách làm như sau:
Bước 1: Bạn cần thêm thư viện thao tác với Excel vào dự án, theo hướng dẫn sau:
Description: C:\Users\ADMIN\Pictures\New folder\DataGridView\wf-039.png
Lựa chọn thư viện Excel
Bước 2: Tạo 1 thư viện thao tác với tệp Excel (tạo thêm 1 file .cs có tên ExportToExcel).
Bạn xây dựng một phương thức Export với tham số truyền vào là 1 đối tượng DataTable chứa dữ liệu muốn kết xuất, có thể thêm các tham số SheetName (tên Sheet trong Excel) hay tiêu đề nếu có.
Bạn tham khảo code sau:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
 
namespace DemoDataGridView
{
    class ExportToExcel
    {
 
        public void Export(DataTable dt, string sheetName, string title)
        {
            //Tạo các đối tượng Excel
            Microsoft.Office.Interop.Excel.Application oExcel = new Microsoft.Office.Interop.Excel.Application();
            Microsoft.Office.Interop.Excel.Workbooks oBooks;
            Microsoft.Office.Interop.Excel.Sheets oSheets;
            Microsoft.Office.Interop.Excel.Workbook oBook;
            Microsoft.Office.Interop.Excel.Worksheet oSheet;
 
            //Tạo mới một Excel WorkBook
            oExcel.Visible = true;
            oExcel.DisplayAlerts = false;
            oExcel.Application.SheetsInNewWorkbook = 1;
            oBooks = oExcel.Workbooks;
 
            oBook = (Microsoft.Office.Interop.Excel.Workbook)(oExcel.Workbooks.Add(Type.Missing));
            oSheets = oBook.Worksheets;
            oSheet = (Microsoft.Office.Interop.Excel.Worksheet)oSheets.get_Item(1);
            oSheet.Name = sheetName;
 
            // Tạo phần đầu nếu muốn
            Microsoft.Office.Interop.Excel.Range head = oSheet.get_Range("A1", "C1");
            head.MergeCells = true;
            head.Value2 = title;
            head.Font.Bold = true;
            head.Font.Name = "Tahoma";
            head.Font.Size = "18";
            head.HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignCenter;
 
            // Tạo tiêu đề cột
            Microsoft.Office.Interop.Excel.Range cl1 = oSheet.get_Range("A3", "A3");
            cl1.Value2 = "Mã đơn vị";
            cl1.ColumnWidth = 13.5;           
 
            Microsoft.Office.Interop.Excel.Range cl2 = oSheet.get_Range("B3", "B3");
            cl2.Value2 = "Tên đơn vị";
            cl2.ColumnWidth = 25.0;
 
            Microsoft.Office.Interop.Excel.Range cl3 = oSheet.get_Range("C3", "C3");
            cl3.Value2 = "Chức năng";
            cl3.ColumnWidth = 40.0;
 
            Microsoft.Office.Interop.Excel.Range rowHead = oSheet.get_Range("A3", "C3");
            rowHead.Font.Bold = true;
            // Kẻ viền
            rowHead.Borders.LineStyle = Microsoft.Office.Interop.Excel.Constants.xlSolid;
            // Thiết lập màu nền
            rowHead.Interior.ColorIndex = 15;
            rowHead.HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignCenter;
 
 
            // Tạo mẳng đối tượng để lưu dữ toàn bồ dữ liệu trong DataTable,
            // vì dữ liệu được được gán vào các Cell trong Excel phải thông qua object thuần.
            object[,] arr = new object[dt.Rows.Count, dt.Columns.Count];
 
            //Chuyển dữ liệu từ DataTable vào mảng đối tượng
            for (int r = 0; r < dt.Rows.Count; r++)
            {
                DataRow dr = dt.Rows[r];
                for (int c = 0; c < dt.Columns.Count; c++)
                {
                    arr[r, c] = dr[c];
                }
            }
 
            //Thiết lập vùng điền dữ liệu
            int rowStart = 4;
            int columnStart = 1;
 
            int rowEnd = rowStart + dt.Rows.Count - 1;
            int columnEnd = dt.Columns.Count;
 
            // Ô bắt đầu điền dữ liệu
            Microsoft.Office.Interop.Excel.Range c1 = (Microsoft.Office.Interop.Excel.Range)oSheet.Cells[rowStart, columnStart];
            // Ô kết thúc điền dữ liệu
            Microsoft.Office.Interop.Excel.Range c2 = (Microsoft.Office.Interop.Excel.Range)oSheet.Cells[rowEnd, columnEnd];
            // Lấy về vùng điền dữ liệu
            Microsoft.Office.Interop.Excel.Range range = oSheet.get_Range(c1, c2);
 
            //Điền dữ liệu vào vùng đã thiết lập
            range.Value2 = arr;
 
            // Kẻ viền
            range.Borders.LineStyle = Microsoft.Office.Interop.Excel.Constants.xlSolid;
            // Căn giữa cột STT
             Microsoft.Office.Interop.Excel.Range c3 = (Microsoft.Office.Interop.Excel.Range)oSheet.Cells[rowEnd, columnStart];
            Microsoft.Office.Interop.Excel.Range c4 = oSheet.get_Range(c1,c3 );
             oSheet.get_Range(c3, c4).HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignCenter;           
 
        }
 
    }
}
Bước 3: Bây giờ bạn chỉ việc gọi phương thức Export của lớp vừa xây dựng trên Form khi nhấn nút “Kết xuất ra Excel”
?
1
2
3
4
5
6
7
8
9
10
11
12
13
private void btnExportExcel_Click(object sender, EventArgs e)
        {
            ExportToExcel excel = new ExportToExcel();
 
            // Lấy về nguồn dữ liệu cần Export là 1 DataTable
     // DataTable này mỗi bạn lấy mỗi khác.
     // Ở đây tôi dùng BindingSouce có tên bs nên tôi ép kiểu như sau:
     // Bạn nào gán trực tiếp vào DataGridView thì ép kiểu DataSource của
     // DataGridView nhé
            DataTable dt = (DataTable) bs.DataSource;
 
            excel.Export(dt, "Danh sach", "DANH SÁCH CÁC ĐƠN VỊ");
        }
Bước 4: Chạy và thử nghiệm bạn sẽ có kết quả tương tự sau:
Kết quả Export to Excel
Chúc bạn thành công!
Tham khảo: http://congnghephanmem.vn/Article.aspx?id=16

No comments:

Post a Comment