http://msdn.microsoft.com/zh-tw/ee818993
也可不透過任何第三方元件,直接用 C# 直接將撈的資料塞到記憶體的 DataTable 裡 (參考 ADO.NET 書籍或網文),再將 DataTable 匯出到 Excel。
Step 1、撈資料庫,或手動塞資料到記憶體裡的 DataTable
從資料庫撈資料成 DataTable,或如下不用資料庫,先手動塞一些資料到 DataTable 當作測試的資料來源:
1 | using System.Data; |
2 | |
3 | DataTable table1 = new DataTable(); |
4 | |
5 | table1.Columns.Add("Name", typeof(string)); |
6 | table.Columns.Add("Number", typeof(int)); |
7 | |
8 | table1.Rows.Add(new object[] { "one", 1 }); |
9 | table1.Rows.Add(new object[] { "two", 2 }); |
10 | table1.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 第三方免費元件。
沒有留言:
張貼留言