Thread was being aborted when exporting to excel?
Solution 1
The ThreadAbortException is thrown from the following line:
HttpContext.Current.Response.End();
Here's more details and a workaround.
Solution 2
I tried using HttpContext.Current.ApplicationInstance.CompleteRequest
. It did work but also exported the complete HTML Code of the page at the end of the downloaded file, which was undesirable.
Response.BuffferOutput = True;
Response.Flush();
Response.Close();
Then after a hell of effort, I bumped into the above code. And it works perfectly without any exception or undesirable code at the end of the downloaded file.
Related videos on Youtube
Vishal_Kotecha
Updated on April 22, 2022Comments
-
Vishal_Kotecha about 2 years
I have a DataTable which is bound to a GridView. I also have a button that when clicked exports the DataTable to an Excel file. However, the following error is occuring:
ErrMsg = "Thread was being aborted."
Here is part of the code where the error is being thrown:
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 { } }
After changing HttpContext.Current.Response.End to HttpContext.Current.ApplicationInstance.CompleteRequest, it now just goes to the finally block and I can't figure out what error message is being thrown.
-
Vishal_Kotecha over 15 yearsI made the change, but now it just goes into the finally block and I can't figure out what the problem is now.
-
Darin Dimitrov over 15 yearsThe code execution will always enter the finally block even if no exception is thrown.
-
Darin Dimitrov over 15 yearsIf you want to handle other exceptions just add the catch(Exception ex) clause.
-
Jui Test about 8 yearsThanks Viral for ur help.It work for me.Thanks for saving my time.Instead of response.end() I wrote following 3 lines.Response.BuffferOutput = True; Response.Flush(); Response.Close();