title: Export to Excel - ThreadAbortException
body: <p>I'm having a problem with the conversion to Excel code I'm finding. I am working on a website project in .NET 4.0, and I have created a class for this that does the following (based on
  <a href="http://mattberseth.com/blog/2007/04/export_gridview_to_excel_1.html" rel="nofollow">http://mattberseth.com/blog/2007/04/export_gridview_to_excel_1.html</a>):</p>
  
  <pre><code>HttpContext.Current.Response.Clear();
  HttpContext.Current.Response.AddHeader("content-disposition",
  string.Format("attachment; filename={0}", fileName)); HttpContext.Current.Response.ContentType = "application/ms-excel"; using (StringWriter sw = new StringWriter()) {
     using (HtmlTextWriter htw = new HtmlTextWriter(sw)) {
      //Create a table to contain the grid
      //Add header row
      //Add each data row
      //Add Footer row
      //Render the table into the htmlwriter
      //  render the htmlwriter into the response
      HttpContext.Current.Response.Write(sw.ToString());
      HttpContext.Current.Response.End();
    }
  }
  </code></pre>
  
  <p>I call this class from a usercontrol that contains a button that is added to a GridView displayed on the page. This works as expected - click the button, you are presented with a download option to either open or save the resulting excel spreadsheet containing the data from the GridView.</p>
  
  <p>However, when I call this from a linkbutton inside a different GridView, I'd like to build a dynamic gridview to contain data and export that. When I do that, I get a ThreadAbortException from the Response.End call in the class.</p>
  
  <p>Question 1: Why do I not get that ThreadAbortException when calling the same code from within a usercontrol? Do usercontrols get their own threads or some other kind of context?</p>
  
  <p>Searching on the error I get when that ThreadAbortException occurs led me to attempt to replace it with ApplicationInstance.CompleteRequest(). When I do that I no longer get the ThreadAbortException, but this breaks the previously working usercontrol - instead of the resulting excel spreadsheet containing the data from the grid, it contains the HTML from the containing page, and at any rate it's easy enough to suppress that error with an empty catch. However, it doesn't fix the direct call with the dynamically generated GridView, that code renders a javascript error: "The message received from the server could not be parsed."</p>
  
  <p>I would love to understand what exactly is going on here, but I'm at the point of needing results regardless of understanding. All the other approaches I've tried (datagrid instead of GridView, etc) run into the same problems, and are essentially the same when it comes down to "taking over"
  the current response and using stringwriter and htmlwriter to render the data into a response with excel contentType. And since this demonstrably works in the context of a usercontrol, I am at my wit's end as to why it won't work when called directly...</p>