介紹:
將GridView的內容導出到Excel是很普通的應用,在很多網站上都有使用。有各種不同的技術來實現GridView導出到Excel中,主要是看應用程序的具體情況。在本文中我將演示一些你會覺得有用的技巧。
從GridView導出到Excel(基礎代碼)
讓我們從基礎的導出方法開始。首先,我們需要用一些數據填充GridView。我創建了一個自定義的數據表,它包含了多個字段。你可以在下面的截圖中看到。
現在,下一步的任務是使用數據庫中的數據來填充GridView。試一試下面的代碼,它使用DataSet來填充GridView。
2{
3
4SqlConnection myConnection = new SqlConnection("Server=localhost;Database=School;Trusted_Connection=true");
5
6SqlDataAdapter ad = new SqlDataAdapter("SELECT * FROM Users", myConnection);
7
8DataSet ds = new DataSet();
9
10ad.Fill(ds);
11
12gvUsers.DataSource = ds;
13
14gvUsers.DataBind();
15
16}
17
18
所以GridView現在已經填充了數據。接下去的任務就是將GridView導出到Excel。你可以在button的click事件中使用下面的代碼。
2
3Response.AddHeader("content-disposition", "attachment; filename=MyExcelFile.xls");
4
5Response.ContentType = "application/excel";
6
7StringWriter sw = new StringWriter();
8
9HtmlTextWriter htw = new HtmlTextWriter(sw);
10
11gvUsers.RenderControl(htw);
12
13Response.Write(sw.ToString());
14
15Response.End();
16
你同時還要重載VerifyRenderingInServerForm方法。參照下面的代碼。
{
}
當你點擊Export to Excel按鈕之後,將會彈出一個對話框讓你選擇打開或者是保存導出的文件。選擇打開文件,你會看到導出的數據顯示在Excel的頁面中。看一看下面的截圖,它顯示了GridView已導出到Excel中。
GridView附帶樣式導出到Excel中
你有沒有發現上面導出代碼的問題?對了,開頭的0都被截去了。這表示如果ID是000345,它會顯示爲345。你可以在輸出的數據流中添加CSS描述來解決該問題。爲了能正確的顯示ID列,你要把它存儲爲文本。文本格式在Excel中用“mso-number-format:"/@”來表示。只要你知道了這個格式,你就可以將這個樣式添加到輸出的數據流中。看看下面的代碼吧。
2{
3
4string style = @"<style> .text { mso-number-format:/@; } </script> ";
5
6Response.ClearContent();
7
8Response.AddHeader("content-disposition", "attachment; filename=MyExcelFile.xls");
9
10Response.ContentType = "application/excel";
11
12StringWriter sw = new StringWriter();
13
14HtmlTextWriter htw = new HtmlTextWriter(sw);
15
16gvUsers.RenderControl(htw);
17
18// Style is added dynamically
19
20Response.Write(style);
21
22Response.Write(sw.ToString());
23
24Response.End();
25
26}
27
28public override void VerifyRenderingInServerForm(Control control)
29{
30
31}
32
正如你在上面的代碼中所看到的,我使用字符串變量“style”來存放GridView中列的樣式。同時,我使用Response.Write方法來將樣式寫入到輸出流中。最後你要做的就是將樣式添加到ID列。這可以在GridView控件的RowDataBound事件中完成。GridView到Excel,該文件的內容會類似於下圖。
2{
3
4if (e.Row.RowType == DataControlRowType.DataRow)
5
6{
7
8e.Row.Cells[1].Attributes.Add("class", "text");
9
10}
11
12}
13
現在,當你導出
查看錶格欄的樣式
你打開導出後的Excel文件就可以輕而易舉的找到GridView中數據欄的正確樣式。現在點擊標題欄並選擇“設置單元格格式”,它將顯示一些參數用來格式化單元格。選擇“文本”並把文件保存爲.htm文件。現在,用瀏覽器打開這個Web文件,然後查看它的源文件。你會在樣式段落髮現不同的單元格所對應的樣式。使用查找功能定位到ID欄。你將發現類似於下面的一行內容:
<td class=xl27 width=35 style='border-left:none;width:26pt'>ID</td>
正如你所看到上面的單元格使用樣式類.x127。現在轉到樣式部分,找到.x127。
2
3 {mso-style-parent:style0;
4
5 font-weight:700;
6
7 mso-number-format:"/@";
8
9 text-align:center;
10
11 vertical-align:middle;
12
13 border:.5pt solid black;
14
15 white-space:normal;}
16
17
當你找到.x127樣式之後,你會發現單元格格式定義爲:mso-number-format:"/@"
帶鏈接按鈕與分頁的GridView導出到Excel:
當你嘗試導出包含帶鏈接按鈕與分頁功能的GridView時,大概會看到下列錯誤:
你可以轉到該頁面的源代碼中,將EnableEventValidation改爲false,這樣即可解決該問題。
現在,讓我們來看看導出的文件:
和你看到的一樣,LinkButton與DropDownList控件也和GridView一起導出了。雖然DropDownList也能正確的顯示用戶的選項,但是它在Excel中並不好看。所以,讓我們看看如何來顯示選中的文本並去除DropDownList。
我創建了一個簡單的方法:DisableControls,它遍歷了GridView中的控件,並用Literal控件代替LinkButton與DropDownList控件。
2{
3
4LinkButton lb = new LinkButton();
5
6Literal l = new Literal();
7
8string name = String.Empty;
9
10for (int i = 0; i < gv.Controls.Count; i++)
11{
12
13if (gv.Controls[i].GetType() == typeof(LinkButton))
14{
15
16l.Text = (gv.Controls[i] as LinkButton).Text;
17
18gv.Controls.Remove(gv.Controls[i]);
19
20gv.Controls.AddAt(i, l);
21
22}
23else if (gv.Controls[i].GetType() == typeof(DropDownList))
24{
25l.Text = (gv.Controls[i] as DropDownList).SelectedItem.Text;
26
27gv.Controls.Remove(gv.Controls[i]);
28
29gv.Controls.AddAt(i, l);
30
31}
32
33if (gv.Controls[i].HasControls())
34{
35 DisableControls(gv.Controls[i]);
36}
37
38}
39
40}
41
42
43
44
這個方法很簡單,用Literal控件來替換所有的LinkButton和DropDownList控件,並把它們的選擇內容賦給Literal控件的Text屬性。你必須在導出之前調用該方法。
2 {
3
4 DisableControls(gvUsers);
5
6 Response.ClearContent();
7
8 Response.AddHeader("content-disposition", "attachment; filename=MyExcelFile.xls");
9
10 Response.ContentType = "application/excel";
11
12 StringWriter sw = new StringWriter();
13
14 HtmlTextWriter htw = new HtmlTextWriter(sw);
15
16 gvUsers.RenderControl(htw);
17
18 Response.Write(sw.ToString());
19
20 Response.End();
21
22 }
最後,當你導出GridView時,只會看到選中的文本內容。看一看下面的截圖所顯示的效果。
//去掉GRID 列頭的排序鏈接功能
void gridToExcel_ItemDataBound(object sender, DataGridItemEventArgs e)
{
//文本:vnd.ms-excel.numberformat:@
//日期:vnd.ms-excel.numberformat:yyyy/mm/dd
//數字:vnd.ms-excel.numberformat:#,##0.00
//貨幣:vnd.ms-excel.numberformat:¥#,##0.00
//百分比:vnd.ms-excel.numberformat: #0.00%
e.Item.Cells[0].Attributes.Add("style", "vnd.ms-excel.numberformat:@"); //0-Pick Ticket#
e.Item.Cells[1].Attributes.Add("style", "vnd.ms-excel.numberformat:@"); //1-customer
if (e.Item.ItemType == ListItemType.Header)
{
for (int i = 0; i < ShipmentDatagrid.Columns.Count; i++)
{
e.Item.Cells[i].Text = ShipmentDatagrid.Columns[i].HeaderText;//remove grid sort link
e.Item.Cells[i].Attributes.Add("style", "background-color: #B5C5D4;font-weight: bold;font-size: 8pt");
}
}
}