上方廣告

Lady Kukki 手作糖霜餅乾

2012年6月1日 星期五

GridView轉出Excel時出現System.OutOfMemoryException 的問題

這幾天在改善系統問題時出現了 System.OutOfMemoryException 的問題,由於這個錯誤訊息提示的關係,直覺是記憶體不足嗎?所以到了Server上執行該程式並監看記憶體使用狀況,似乎沒有很誇張,Google了一下,保哥有提到遇到此問題的解決辦法,按照保哥的方式調整發現,問題還在,所以就是程是本身的問題了。 
但是我本身還是有點不信邪,交叉測試了一下,由於公司系統是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 的問題