GridView轉出Excel時出現System.OutOfMemoryException 的問題
這幾天在改善系統問題時出現了 System.OutOfMemoryException 的問題,由於這個錯誤訊息提示的關係,直覺是記憶體不足嗎?所以到了Server上執行該程式並監看記憶體使用狀況,似乎沒有很誇張,Google了一下,保哥有提到遇到此問題的解決辦法,按照保哥的方式調整發現,問題還在,所以就是程是本身的問題了。
但是我本身還是有點不信邪,交叉測試了一下,由於公司系統是Server2003 x86,我把相關程式跑在我的Windows7 x64上面發現,可以正常處理(我的電腦比公司的伺服器還強 ^^)。
查看了一下程是本來的寫法如下,從程式看起來先把資料餵給GridView,然後再用HtmlForm畫出來,如此多此一舉的動作,在資料量極大的情況之下,有非常大的可能會出現該錯誤。
於是稍微調整一下如下,直接使用DataGrid畫出,不要再透過IO,如此一來就改善了此問題。
相關連結
保哥 處理System.OutOfMemoryException 的問題
但是我本身還是有點不信邪,交叉測試了一下,由於公司系統是Server2003 x86,我把相關程式跑在我的Windows7 x64上面發現,可以正常處理(我的電腦比公司的伺服器還強 ^^)。
查看了一下程是本來的寫法如下,從程式看起來先把資料餵給GridView,然後再用HtmlForm畫出來,如此多此一舉的動作,在資料量極大的情況之下,有非常大的可能會出現該錯誤。
Response.Clear(); Response.AddHeader("content-disposition", "attachment;filename=xxxx.xls"); Response.ContentType = "application/vnd.xls"; Response.ContentEncoding = System.Text.Encoding.GetEncoding("utf-8"); Response.Write("");//加上語系指定utf-8避免亂碼 System.IO.StringWriter sw = new System.IO.StringWriter(); System.Web.UI.HtmlTextWriter htw = new HtmlTextWriter(sw); //關閉換頁跟排序 gvMain.AllowSorting = false; gvMain.AllowPaging = false; gvMain.DataSource = DataTable;//資料來源 gvMain.DataBind(); HtmlForm hf = new HtmlForm(); Controls.Add(hf); hf.Controls.Add(gvMain); hf.RenderControl(htw); Response.Write(sw.ToString()); Response.End();
於是稍微調整一下如下,直接使用DataGrid畫出,不要再透過IO,如此一來就改善了此問題。
Response.Clear();
Response.AddHeader("content-disposition", "attachment;filename=xxxx.xls");
Response.Write(""); //加上語系指定utf-8避免亂碼
Response.ContentType = "application/vnd.xls";
//附帶一提在Excel中若要換行,不能直接使用
,這樣會導致換到下一個儲存格
//必須使用
using (System.Web.UI.HtmlTextWriter htmlWrite = new HtmlTextWriter(Response.Output))
{
//可更換字型
htmlWrite.Write("");
DataGrid myDataGrid = new DataGrid();
myDataGrid.DataSource = DataTable;//資料來源
myDataGrid.DataBind();
myDataGrid.RenderControl(htmlWrite);
}
Response.End();
相關連結
保哥 處理System.OutOfMemoryException 的問題
留言
張貼留言
您好,我是 Lawrence,這裡是我的開發筆記的網誌,如果你對我的文章有任何疑問或者有錯誤的話,歡迎留言讓我知道。