摘要:讀者詢問將 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
章立民研究室
6