將GridView的內容導出到Excel中

介紹:

    GridView的內容導出到Excel是很普通的應用,在很多網站上都有使用。有各種不同的技術來實現GridView導出到Excel中,主要是看應用程序的具體情況。在本文中我將演示一些你會覺得有用的技巧。

GridView導出到Excel(基礎代碼)

    讓我們從基礎的導出方法開始。首先,我們需要用一些數據填充GridView。我創建了一個自定義的數據表,它包含了多個字段。你可以在下面的截圖中看到。



   
現在,下一步的任務是使用數據庫中的數據來填充GridView。試一試下面的代碼,它使用DataSet來填充GridView。

 1private void BindData()
 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。你可以在buttonclick事件中使用下面的代碼。

 1Response.ClearContent();
 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方法。參照下面的代碼。

 public override void VerifyRenderingInServerForm(Control control)

{

}

    當你點擊Export to Excel按鈕之後,將會彈出一個對話框讓你選擇打開或者是保存導出的文件。選擇打開文件,你會看到導出的數據顯示在Excel的頁面中。看一看下面的截圖,它顯示了GridView已導出到Excel中。

 

GridView附帶樣式導出到Excel

    你有沒有發現上面導出代碼的問題?對了,開頭的0都被截去了。這表示如果ID000345,它會顯示爲345。你可以在輸出的數據流中添加CSS描述來解決該問題。爲了能正確的顯示ID列,你要把它存儲爲文本。文本格式在Excel中用“mso-number-format:"/@”來表示。只要你知道了這個格式,你就可以將這個樣式添加到輸出的數據流中。看看下面的代碼吧。

 1protected void Btn_ExportClick(object sender, EventArgs e)
 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事件中完成。GridViewExcel,該文件的內容會類似於下圖。

 1protected void gvUsers_RowDataBound(object sender, GridViewRowEventArgs e)
 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

 1 .xl27
 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,這樣即可解決該問題。

<%@ Page Language="C#" EnableEventValidation="false" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

現在,讓我們來看看導出的文件:

 

    和你看到的一樣,LinkButtonDropDownList控件也和GridView一起導出了。雖然DropDownList也能正確的顯示用戶的選項,但是它在Excel中並不好看。所以,讓我們看看如何來顯示選中的文本並去除DropDownList

    我創建了一個簡單的方法:DisableControls,它遍歷了GridView中的控件,並用Literal控件代替LinkButtonDropDownList控件。

 1private void DisableControls(Control gv)
 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控件來替換所有的LinkButtonDropDownList控件,並把它們的選擇內容賦給Literal控件的Text屬性。你必須在導出之前調用該方法。

 1 protected void Btn_ExportExcelPaging(object sender, EventArgs e)
 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");
                }
            }
        }

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章