讀者問與答

原發問問題:
 
章老師:
 
自從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", "p_w_upload; 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", "p_w_upload;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
相關文章
相關標籤/搜索