2008年4月8日 星期二

將ASP.NET查詢結果(GridView)匯出為Excel檔

雖然開發ASP.NET將GridView的內容直接轉成Excel檔並不是什麼新技術了,不過在寫程式的時候,有時候遇到這樣的功能時,還是會"熊熊"(台語)忘記應該要注意的地方,例如:如果GridView是動態載入或是動態建立的模式時,還是有一些小"眉角"(台語)是必須要注意的,不然執行時還是會出錯。

亞當斯這邊要記錄的是,將匯出Excel檔的函式封裝在元件中,以方便ASP.NET應用程式可以共用,這樣的設計方式,就必須在網頁上動些小手腳。

以下為簡易的設計步驟(這邊我用VB來寫範例,需要C#的朋友就自己轉囉):
1.先將匯出Excel的函式寫在一個類別函式庫(Class Library)中,這個ExportGridView方法接收兩個參數,分別是檔案名稱以及GridView物件,並且宣告為靜態方法:Shared。

Excel01

2.因為GridView物件必須置於有 runat=server 的表單標記之中,所以請在ASP.NET網頁程式碼中,加入以下這段程式(AJAX也適用):

Excel02

3.在ASP.NET網頁中先取資料,將結果放置到GridView控制項中,然後可以設計一個按鈕控制項,當按下按鈕後去叫用ExportGridView方法,就可以將資料匯出到Excel中。
Excel03 4.如果沒有加入第二步驟的程式區段,將會產生以下錯誤畫面。
Excel04

5.不過如果你的GridView控制項有設定分頁或是排序的話,此時還是會產生錯誤,解決方式就是可以在web.config中設定enableEventValidation,如下:
<pages enableEventValidation="false">

7 則留言:

Colin 提到...

Dear Adams
請問我在匯出時已經有加入 gv.AllowPaging = False
gv.AllowSorting = False
但在Excel 中,仍有分頁與排序,該怎麼處理呢?謝謝

艾小莎 提到...

Dear Adams, 想請教一下, 我依您的步驟也做了一個 class..但是執行時, 就出現 "因為保護層級,無法存取 'System.IO.StreamWriter.StreamWriter()....請問是否遺漏了什麼地方呢?

亞當斯(Adams) 提到...

不知道你是否可以把錯誤的畫面抓下來寄給我看一下,一般來說通常是沒有問題,因為保護層級是否是因為你的瀏覽器有設定了什麼嚴密的安全性?
my mail : adamschao@gmail.com

LastResort 提到...

請借我轉載,若有不妥,請至我的網頁留言,謝謝~

提到...

Dear Adams,我用了您所提供的方式來做Gridview匯出Excel
*****
Microsoft JScript 執行階段錯誤: Sys.WebForms.PageRequ
詳細資料: 剖析 near '<meta http:equiv=Con' 時發生
*****
是因為Gridview是在UpdatePanel中的原因嗎?有辦法解決嗎?

提到...

在網路上找了一下,發現將按鈕拉到UpdatePanel外可以解決我的問題,但是,按鈕位置變更動後,版面的編排就不是我所預期的樣子,有辦法在UpdatePanel中使用嗎?

buber 提到...

翔提到..不想將按鈕拉到UpdatePanel外,
可於< Triggers >中加入< asp:PostBackTrigger ControlID="ButtonExcel" / >