将查询结果导出到客户端的EXCEL中(四)
利用DataGrid,直接将数据输出到Excel中,原理跟从服务器下载文件一样。示例代码如下:
跟下载一样,由于调用了response.End()方法,有可能会造成一些异常,就像调用Response.redirect("")会引发潜在的“线程正在被终止”的异常一样。当然那个异常可以转向其他页面而逃之大吉,不必理会那个异常(也可以通过调用Response.redirect("",false)避免这个异常),可是下载却不像转向页面那般轻松,他要固守阵地,留在原来的页面。
这样造成的负面影响是使页面的某些控件失去响应,某些JavaScript不再运行。这是很讨厌的事情。
由于与现在的负面效应以及原因相同,将在讲述下载实现的时候一并解决。
好了,至此将DataGrid或者服务器上的数据下载到客户端Excel的四种方法就总结完毕了。总得来说,我比较倾向于用从DataGrid中导出的方式,这样的速度也是最快的,并且没有并发,格式等的困扰。由于项目时间很紧,没有来得及深入研究response.End()引发异常的原因及解决方案,导致下载时会引发用户控件失效,最终放弃了这种做法。采用了第二种方式,效果差强人意。在采用OLEDB读写Excel的时候也遇到了很多一些奇怪的问题,将在下面的文章中描述。
/// <summary>
/// 将DataGrid中的数据输出到客户端的Excel中
/// </summary>
/// <param name="ultraWebGrid">待输出的DataGrid</param>
private void RenderExcel(System.Web.UI.WebControls.DataGrid ultraWebGrid)
{
//当前页面的响应
HttpResponse response = HttpContext.Current.Response;
response.Charset = "GB2312"; //字符集
response.ContentEncoding = Encoding.GetEncoding("GB2312"); //设置编码方式
response.ContentType = "application/msexcel"; //设置输出方式
response.AppendHeader("Content-Disposition",
"attachment;filename=" +HttpUtility.UrlEncode(_fileName)); //http头
CultureInfo cult = new CultureInfo("zh-CN", true);
StringWriter sw = new StringWriter(cult);
HtmlTextWriter writer = new HtmlTextWriter(sw);
writer.WriteLine("<meta http-equiv=\"Content-Type\" content=\"text/html;charset=GB2312\">");
if (ultraWebGrid != null)
{
ultraWebGrid.RenderControl(writer); //输出
}
ultraWebGrid.Dispose(); //释放DataGrid
response.Write(sw.ToString());
response.End(); //输出结束
}
/// 将DataGrid中的数据输出到客户端的Excel中
/// </summary>
/// <param name="ultraWebGrid">待输出的DataGrid</param>
private void RenderExcel(System.Web.UI.WebControls.DataGrid ultraWebGrid)
{
//当前页面的响应
HttpResponse response = HttpContext.Current.Response;
response.Charset = "GB2312"; //字符集
response.ContentEncoding = Encoding.GetEncoding("GB2312"); //设置编码方式
response.ContentType = "application/msexcel"; //设置输出方式
response.AppendHeader("Content-Disposition",
"attachment;filename=" +HttpUtility.UrlEncode(_fileName)); //http头
CultureInfo cult = new CultureInfo("zh-CN", true);
StringWriter sw = new StringWriter(cult);
HtmlTextWriter writer = new HtmlTextWriter(sw);
writer.WriteLine("<meta http-equiv=\"Content-Type\" content=\"text/html;charset=GB2312\">");
if (ultraWebGrid != null)
{
ultraWebGrid.RenderControl(writer); //输出
}
ultraWebGrid.Dispose(); //释放DataGrid
response.Write(sw.ToString());
response.End(); //输出结束
}
跟下载一样,由于调用了response.End()方法,有可能会造成一些异常,就像调用Response.redirect("")会引发潜在的“线程正在被终止”的异常一样。当然那个异常可以转向其他页面而逃之大吉,不必理会那个异常(也可以通过调用Response.redirect("",false)避免这个异常),可是下载却不像转向页面那般轻松,他要固守阵地,留在原来的页面。
这样造成的负面影响是使页面的某些控件失去响应,某些JavaScript不再运行。这是很讨厌的事情。
由于与现在的负面效应以及原因相同,将在讲述下载实现的时候一并解决。
好了,至此将DataGrid或者服务器上的数据下载到客户端Excel的四种方法就总结完毕了。总得来说,我比较倾向于用从DataGrid中导出的方式,这样的速度也是最快的,并且没有并发,格式等的困扰。由于项目时间很紧,没有来得及深入研究response.End()引发异常的原因及解决方案,导致下载时会引发用户控件失效,最终放弃了这种做法。采用了第二种方式,效果差强人意。在采用OLEDB读写Excel的时候也遇到了很多一些奇怪的问题,将在下面的文章中描述。