Экспорт в Excel - ThreadAbortException - PullRequest
0 голосов
/ 18 июня 2011

У меня проблема с преобразованием в код Excel, который я нахожу. Я работаю над проектом веб-сайта в .NET 4.0, и я создал класс для этого, который делает следующее (на основе http://mattberseth.com/blog/2007/04/export_gridview_to_excel_1.html):

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();
  }
}

Я вызываю этот класс из пользовательского элемента управления, который содержит кнопку, которая добавляется в GridView, отображаемое на странице. Это работает, как и ожидалось - нажмите кнопку, вам предоставляется возможность загрузки, чтобы открыть или сохранить полученную электронную таблицу Excel, содержащую данные из GridView.

Однако, когда я вызываю это из кнопки ссылки в другом GridView, я хотел бы создать динамическое сеточное представление, которое будет содержать данные и экспортировать их. Когда я это делаю, я получаю исключение ThreadAbortException от вызова Response.End в классе.

Вопрос 1. Почему я не получаю исключение ThreadAbortException при вызове того же кода из пользовательского контроля? Получают ли пользовательские элементы управления свои собственные потоки или какой-то другой контекст?

Поиск ошибки, которую я получаю, когда возникает исключение ThreadAbortException, привело меня к попытке заменить его на ApplicationInstance.CompleteRequest (). Когда я это делаю, я больше не получаю исключение ThreadAbortException, но это нарушает ранее работающий пользовательский контроль - вместо результирующей электронной таблицы Excel, содержащей данные из сетки, он содержит HTML-код с содержащейся страницы, и, во всяком случае, его достаточно легко подавить. эта ошибка с пустым уловом. Однако он не исправляет прямой вызов с динамически сгенерированным GridView, этот код выдает ошибку javascript: «Сообщение, полученное с сервера, не может быть проанализировано».

Мне бы очень хотелось понять, что именно здесь происходит, но я нахожусь в точке, требующей результатов, независимо от понимания. Все другие подходы, которые я пробовал (datagrid вместо GridView и т. Д.), Сталкиваются с теми же проблемами и по сути одинаковы, когда дело доходит до «захвата» текущий ответ и использование stringwriter и htmlwriter для рендеринга данных в ответ с помощью Excel contentType. И так как это явно работает в контексте пользовательского контроля, я нахожусь в своем уме, почему он не будет работать при непосредственном вызове ...

Ответы [ 4 ]

0 голосов
/ 18 июля 2014

Событие, при котором вызывается код Export to Excel, должно выполнить полную обратную передачу.проблема в том, что он выполняет только частичную обратную передачу.

У меня была такая же ошибка, и она была решена, когда я сделал полную обратную передачу.

Надеюсь, это кому-нибудь поможет.

0 голосов
/ 18 июня 2011

используйте это

   Response.Clear()
    Response.AddHeader("content-disposition", atchment;filename=fm_specification.xls")
    Response.Charset = ""
    Response.Cache.SetCacheability(HttpCacheability.NoCache)
    Response.ContentType = "application/vnd.xls"
    Dim stringWrite As System.IO.StringWriter = New System.IO.StringWriter
    Dim htmlwrite As System.Web.UI.HtmlTextWriter = New HtmlTextWriter(stringWrite)
    GridView1.RenderControl(htmlwrite)
    Response.Write(stringWrite.ToString)
    Response.End()

вместо gridview1, вы можете использовать div

                            dont forget to add this on your page

 Public Overrides Sub VerifyRenderingInServerForm(ByVal control As Control)
 End Sub
0 голосов
/ 22 июня 2011

Проблема была фактически совершенно не связана с экспортом в Excel. Ошибка «… не удалось разобрать» была ключевой. Из этих ссылок я получил ключ, который состоял в том, что события сетки вызывают только частичное событие обратной передачи:

http://forums.asp.net/t/1392827.aspx

http://forums.aspfree.com/net-development-11/gridview-footer-template-button-in-updatepanel-not-posting-back-236087.html

Это объясняет исключение ThreadAbortException и ошибку «… не удалось проанализировать». Добавление этого в OnPreRender ImageButton было решением:

protected void addTrigger_PreRender(object sender, EventArgs e)
{
    if (sender is ImageButton)
    {
        ImageButton imgBtn = (ImageButton)sender;
        ScriptManager ScriptMgr = (ScriptManager)this.FindControl("ScriptManager1");
        ScriptMgr.RegisterPostBackControl(ImgBtn);
    }
}
0 голосов
/ 18 июня 2011

Попробуйте вместо этого: HttpApplication.CompleteRequest () согласно: http://www.c6software.com/codesolutions/dotnet/threadabortexception.aspx

Они обсуждают дополнительный всплывающий HTML

...