导出到excel时线程被中止了吗?

我有一个绑定到GridView的DataTable。 我还有一个按钮,单击时将DataTable导出到Excel文件。 但是,发生以下错误:

ErrMsg =“线程正在中止。”

以下是抛出错误的代码的一部分:

private static void Export_with_XSLT_Web(DataSet dsExport, string[] sHeaders, string[] sFileds, ExportFormat FormatType, string FileName) { try { // Appending Headers HttpContext.Current.Response.Clear(); HttpContext.Current.Response.Buffer = true; if(FormatType == ExportFormat.CSV) { HttpContext.Current.Response.ContentType = "text/csv"; HttpContext.Current.Response.AppendHeader("content-disposition", "attachment; filename=" + FileName); } else { HttpContext.Current.Response.ContentType = "application/vnd.ms-excel"; HttpContext.Current.Response.AppendHeader("content-disposition", "attachment; filename=" + FileName); } // XSLT to use for transforming this dataset. MemoryStream stream = new MemoryStream(); XmlTextWriter writer = new XmlTextWriter(stream, Encoding.UTF8); CreateStylesheet(writer, sHeaders, sFileds, FormatType); writer.Flush(); stream.Seek(0, SeekOrigin.Begin); XmlDataDocument xmlDoc = new XmlDataDocument(dsExport); //dsExport.WriteXml("Data.xml"); XslTransform xslTran = new XslTransform(); xslTran.Load(new XmlTextReader(stream), null, null); using(StringWriter sw = new StringWriter()) { xslTran.Transform(xmlDoc, null, sw, null); //Writeout the Content HttpContext.Current.Response.Write(sw.ToString()); writer.Close(); stream.Close(); HttpContext.Current.Response.End(); } } catch(ThreadAbortException Ex) { string ErrMsg = Ex.Message; } catch(Exception Ex) { throw Ex; } finally { } } 

在将HttpContext.Current.Response.End更改为HttpContext.Current.ApplicationInstance.CompleteRequest后,它现在只是转到finally块,我无法弄清楚抛出了什么错误消息。

从以下行抛出ThreadAbortException:

 HttpContext.Current.Response.End(); 

这里有更多细节和解决方法。

我尝试使用HttpContext.Current.ApplicationInstance.CompleteRequest 。 它确实有效,但也在下载文件的末尾导出了页面的完整HTML代码,这是不可取的。

 Response.BuffferOutput = True; Response.Flush(); Response.Close(); 

经过一番努力,我碰到了上面的代码。 并且它在下载文件的末尾没有任何exception或不需要的代码,完美地工作。

资源

该exception是由Response.End引起的

你可以做的一件事就是逻辑地捕获exception消息……

此方法不会影响数据,但只会捕获exception…

 Try .........(codes here) Response.End Catch ex as Message If Not ex.Message = "Thread was being aborted." Then Response.write(ex.message) End If End Try 

我在这里有不同的故事,我正在使用telerik控件而NONE帮助了我,最终我开始知道我必须在telerik中包装我的标记:RadAjaxPanel ,下面是在RequestStart客户端事件处理程序上禁用ajax的代码片段。

  

然后在我的用户控件中,我添加了另外一个函数,如下所示:

  

它很简单,你可以尝试:

Response.Close(); 代替Response.End();