2014年8月1日 星期五

把DB撈出來的資料並塞到excel

把DB撈出來的資料並塞到excel

http://msdn.microsoft.com/zh-tw/ee818993 
也可不透過任何第三方元件,直接用 C# 直接將撈的資料塞到記憶體的 DataTable 裡 (參考 ADO.NET 書籍或網文),再將 DataTable 匯出到 Excel。

Step 1、撈資料庫,或手動塞資料到記憶體裡的 DataTable 
從資料庫撈資料成 DataTable,或如下不用資料庫,先手動塞一些資料到 DataTable 當作測試的資料來源:
1using System.Data; 
2
3DataTable table1 = new DataTable(); 
4
5table1.Columns.Add("Name"typeof(string)); 
6table.Columns.Add("Number"typeof(int)); 
7
8table1.Rows.Add(new object[] { "one", 1 }); 
9table1.Rows.Add(new object[] { "two", 2 }); 
10table1.Rows.Add(new object[] { "three", 3 }); 
開新視窗(view plain) | 列印(print) | ?



Step 2、DataTable 匯出到 Excel (匯出前,可先手動塞入自訂的一行或多行 (tr),或調整輸出格式和背景色):
");
");
);      //抬頭背景為淺黃色,文字橫向為置中對齊
"
1    /************** 以下為 GridView 匯出成 Excel 的相關設定 ***************/ 
2
3    //匯出 Excel 
4    protected void Button2_Click(object sender, EventArgs e) 
5    { 
6//        if (GridView1.Rows.Count > 0) 
7//        { 
8            //匯出 Excel (直接從資料來源 DataTable 產生 Excel。 此種 Excel 可加入自訂記錄列) 
9            DataTable table1 = new DataTable(); 
10
11            table1.Columns.Add("Name"typeof(string)); 
12            table.Columns.Add("Number"typeof(int)); 
13
14            table1.Rows.Add(new object[] { "one", 1 }); 
15            table1.Rows.Add(new object[] { "two", 2 }); 
16            table1.Rows.Add(new object[] { "three", 3 }); 
17
18            if (table1.Rows.Count > 0) 
19                this.exportDataTableToExcel(dt); 
20//        } 
21//        else 
22//        { 
23//            自訂訊息類別.popupAlert(this.Page, "至少要有一筆資料,才能匯出成 Excel!"); 
24//        } 
25    } 
26
27
28    //匯出 Excel (直接從資料來源 DataTable 產生 Excel。 此種 Excel 可加入自訂記錄列) 
29    private void exportDataTableToExcel(System.Data.DataTable pDataTable) 
30    { 
31        int tRowCount = pDataTable.Rows.Count; 
32        int tColumnCount = pDataTable.Columns.Count; 
33
34        Response.Expires = 0; 
35        Response.Clear(); 
36        Response.Buffer = true
37        Response.Charset = "utf-8"
38        Response.ContentEncoding = System.Text.Encoding.UTF8; 
39        Response.ContentType = "application/vnd.ms-excel"
40        Response.AddHeader("Content-Disposition", "attachment; filename=ExportedData.xls"); 
41        Response.Write(""); 
42
43        Response.Write(""
); 
44
45        //Response.Write("
自訂表頭訊息
46
47        Response.Write("\n 
48        for (int i = 0; i < tColumnCount; i++) 
49        { 
50            Response.Write("\n "
51            Response.Write(pDataTable.Columns[i].ColumnName); 
52            Response.Write("\n 
); 
53
        }
54
        Response.Write("\n 
");  55
                
56
        for (int j = 0; j < tRowCount; j++)
57
        {
58
            Response.Write("\n  " );
59
            for (int k = 0; k < tColumnCount; k++)
60
            {                
61
                if ((k == 0) || (k == 9) || (k == 10))  //若為日期,則手動刪除後面的「時、分、秒」
62
                {
63
                    Response.Write("\n 
"
);        //文字橫向為靠右對齊
64
                    if (!string.IsNullOrEmpty(pDataTable.Rows[j][k].ToString().Replace(" ", "").Trim()))   //若此日期欄位不為 Null 或空值
65
                        Response.Write(pDataTable.Rows[j][k].ToString().Substring(0, 10));
66
                }
67
                else if ((k == 12) || (k == 14))        //若為數值,欲加上三位一撇的千分位符號、小數點後的位數
68
                {
69
                    Response.Write("\n 
"
);        //文字橫向為靠右對齊
70
                    Response.Write(String.Format("{0:#,0.##}", Convert.ToDecimal(pDataTable.Rows[j][k].ToString())));
71
                }
72
                else if ((k == 13) || (k == 15))        //若為數值(xx率),欲加上小數點後的 2 個位數
73
                {                    
74
                    //Response.Write(String.Format("{0:#,0.##}", Convert.ToDecimal(pDataTable.Rows[j][k].ToString())));
75
                    Response.Write("\n 
"
);
76
                    Response.Write(pDataTable.Rows[j][k].ToString());
77
                }
78
                else
79
                {
80
                    Response.Write("\n 
"
);        //文字橫向為靠右對齊
81
                    Response.Write(pDataTable.Rows[j][k].ToString());
82
                }                
83

84
                Response.Write("\n 
" );  85
            }
86
            Response.Write("\n 
");  87
        }
88

89
        //Response.Write("
自訂表尾訊息
");
90

91
        Response.Write("
");  92
        Response.End();
93

94
        if (pDataTable != null)
95
            pDataTable.Dispose();       //註記已可釋放此 DataTable        
96
    }
開新視窗(view plain) | 列印(print) | ?
上述這種做法的特性或優點:

特性:
(1) 捉 DataTable 當作產出 Excel 的資料來源,此 DataTable 也可同時當作頁面上的 GridView 來當作資料來源,讓頁面上
  的 GridView 顯示內容,和輸出的 Excel 的內容一致。
(2) 此種做法,產出的 Excel 格式為 HTML。

優點:
(1) 自己寫 ADO.NET 直接連資料庫後回傳的 DataTable,可自己動態調整內容再匯出成 Excel,做法較有彈性。
(2) 此種做法產生的 Excel 可加入一或多筆自訂的記錄列 (如: 表頭和表尾)。
(3) 此種做法產生的 Excel 可自訂欄位格式成「文字」格式。如: 1.00,在 Excel 中預設會顯示為 1。
必須手動在程式裡加入格式(可參考範例),才能設成「自訂」格式,讓 1.00 就是顯示成 1.00。

缺點:
(1) 此種做法,產出的格式看起來像 Excel,也可用 Excel 開啟,但不是真正二進位的 Excel 檔案。
  若要產出真正的二進位 Excel 檔案,參考一樓的 NPOI 第三方免費元件。


在 Server 端存取 Excel 檔案的利器:NPOI Library






沒有留言: