2009年12月29日 星期二

GridView轉Excel發生『無法讀取檔案』錯誤

某天,User提了個意料之中的需求..."把這個查詢清單轉成Excel"

好嘛,其實也很簡單,古老的作法是直接程式刻個只有一張<table>的網頁,content-type改成x-xls,header加入 Content-Disposition: attachment; filename="your-filename"就行了。
況且ASP有個叫GridView的東西,連手刻表格都不用了,多好 XD

黑暗執行緒 GridView轉Excel範例:TIPS-Export GridView To Excel

不過我的懶人作法是,建一個新的asp檔案,放一個空的GridView,把查詢好的DataTable直接丟過去,在Page_Load裡改header,GridView1.DataBind(),收工 XD

原本好好的,但前幾天有user反應下載的excel打不開,出現"無法讀取檔案"的錯誤。
想了一下,這種作法是直接把網頁丟給Excel去開,應該不會有檔案格式或相容性問題;content-type也沒寫錯;也許是編碼問題,但測試後證實不是,況且編碼有問題的話應該會看到亂碼而不是打不開檔案。
反覆找了幾個user測試,發現是資料筆數問題。當筆數大約20筆以上時就會發生錯誤。Google一下,發現只有一個人問過這樣的問題,但他的狀況是38筆,而且這人最後採行的解法是『手刻csv下載』,看了實在很難過.....

類似問題:GridView 轉換為 EXCEL時發生超過38列資料就會顯示"無法讀取檔案"

不死心,忽然想到既然是用Excel開網頁,那應該可以直接用文字編輯器打開檔案吧?死馬當活馬醫,用Notepad++打開後,看到一個很眼熟的hidden欄位,後面跟著一長串的字串,那個欄位叫ViewState.......
是的,找到兇手了...這ViewState被包在<div>裡,等於是在一個Excel儲存格裡塞進了過長的字串,導致Excel無法開啟。
所以,解決的方法就是...
GridView1.EnableViewState=false;

打完收工