讀者詢問將 GridView 內容匯出成 Excel 檔案問題

摘要:讀者詢問將 GridView 內容匯出成 Excel 檔案問題

原發問問題:
 

老師:

自從ASP.NET拜讀老師大作受益良多,由 Visual C# 2005 大作發現了EXCEL資料連線方式,然而在ASP.NET方面如何處理EXCEL卻發現了下述問題。

 

ASP.NET C# GridView 轉換為 Excel ,發現 EXCEL 筆數隻要超過38筆,就會顯示『無法讀取檔案』,請問是為何?造成EXCEL檔無法開啟,但是用純GridView顯示資料卻正常。

 

DataSet myDataSet = new DataSet();

 

............................................................

.............................................................

 

GridView1.DataSource = myDataSet.Tables["tb"];

 

GridView1.DataBind();

Response.AddHeader("content-disposition", "attachment; filename= "a.xls");

 

Response.ContentType = "application/vnd.ms-excel";

System.IO.StringWriter tw = new System.IO.StringWriter();

HtmlTextWriter hw = new HtmlTextWriter(tw);

GridView1.RenderControl(hw);

Response.Write(tw.ToString());

Response.End();

 

 

親愛的amicky讀者您好很感謝您對於章立民研究室的支持,有關於您提到的問題,回覆如下

 

首先,要說明的是如何連結至Excel檔案。圖表1所示者是網頁範例的設計畫面,從畫面中可以清楚的看到,GridView控制項使用SqlDataSource控制項來連結至Excel檔案:  


圖表
1

 

 在新增GridView控制項的資料連結時,請按下「加入連接」對話方塊的「變更連結」按鈕,然後如圖表2所示,選取「資料提供者」下拉式清單的 .NET Framework Data Provider for OLE DB項目,按下「確定」按鈕回到「加入連結」對話方塊:

 

 
圖表2

 

 請如圖表3所示,選取OLE DB提供者」下拉式清單的Microsoft Jet 4.0 OLE DB Prodiver項目,並按下「資料連結」按鈕:

 

 
圖表3

 

 

請於「資料連結內容」對話方塊中,選取作為資料來源的Excel檔案之後,按下「確定」按鈕回到「加入連接」對話方塊,如圖表4所示:

 

 
圖表4

 

 

請按下「加入連接」對話方塊中的「進階」按鈕,將「進階屬性」對話方塊的Extended Properties屬性設定為Excel 8.0,完成之後按下「確定」按鈕,回到「加入連接」對話方塊,如圖表5所示:

 

 
圖表5

 

 

接下來,請自行依照「加入連接」對話方塊的提示,繼續完成新增GridView控制項之資料連結的作業。 

 加入資料連結之後,我們在畫面上配置了一個Button控制項,以便當使用者用滑鼠按一下按鈕時,會將目前GridView控制項的資料寫出,產生Excel檔案,請替Button控制項的Click事件處理常式撰寫如下所示的程式碼: 

 protected void Button1_Click(object sender, EventArgs e)
{
 System.IO.StringWriter tw = new System.IO.StringWriter();
 HtmlTextWriter hw = new HtmlTextWriter(tw);
 string excelFileName = "
測試Excel檔案.xls"
;
 
 
Context.Response.ContentType = "application/x-excel";
 Context.Response.AddHeader("content-disposition", "attachment;filename=" +
   Server.UrlEncode(excelFileName));
 this.GridView1.RenderControl(hw);
 Context.Response.Write(tw.ToString());

 Context.Response.End();
}
 

 請覆寫VerifyRenderingInServerForm方法,以便讓使用者能夠下載Excel檔案,如下所示: 

 public override void VerifyRenderingInServerForm(Control control) 

 {
 
}

請替GridView控制項的RowDataBound事件處理常式撰寫如下所示的程式碼,以便讓GridView控制項每列資料的第一個欄位能夠顯示該筆資料的資料編號:

 

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
 //
如果繫結的資料列不是 GridView 控制項的頁首,

 // 則將資料列第一個欄位之 Label 控制項的文字設定為「資料列數加1」,
 // 以便代表資料編號。
 if (e.Row.RowType != DataControlRowType.Header)
 {
  e.Row.Cells[0].Text = (e.Row.RowIndex + 1).ToString();
 }
}

 

 

網頁範例的執行結果如圖表6所示,請用滑鼠按一下「產生Excel按鈕,以便將目前GridView控制項的內容寫入Excel檔案,並開始下載,如圖表7所示:

 



圖表6

 

  


圖表
7

 

 

最後,測試Excel檔案.xls檔案的內容如圖表8所示,大家會發現資料的內容正好與GirdView控制項的內容相符,而這也是我們希望的結果:

 


圖表
8

 

 

章立民研究室 2007/4/20

 

 

 

 

 

 

6