Вопрос

У меня проблема с преобразованием в код 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();
  }
}
.

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

Однако, когда я называю это из LinkButton внутри другого GreeView, я хотел бы создать динамическое GreatView, чтобы содержать данные и экспортировать это. Когда я делаю это, я получаю ThreadabortException из отклика. Деньшая вызов в классе.

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

Поиск по ошибке, которую я получаю, когда происходит, когда происходит, привело меня к попытке заменить его с помощью applyInstance.completerequest (). Когда я делаю это, я больше не получаю threadabortexception, но это ломает ранее работающий USERCONTROL - вместо полученной электронной таблицы Excel, содержащий данные из сетки, он содержит HTML с содержащегося страницы, и при любой скорости достаточно легко подавить эта ошибка с пустым уловом. Однако он не исправит прямой вызов с динамически сгенерированным GRIDView, этот код отображает ошибку JavaScript: «Сообщение, полученное с сервера, не может быть проанализировано».

Я хотел бы понять, что именно здесь происходит, но я в точке нуждающихся в результате результатов независимо от понимания. Все остальные подходы, которые я пробовал (DataGrid вместо GRIDVIEW и т. Д.) Работает в те же проблемы, и по существу одинаковы, когда дело доходит до «захвата» Текущий ответ и использование StringWriter и HTMLWriter для рендеринга данных в ответ с ContentType Excel. И поскольку это очевидно, работает в контексте USERCONTROL, я нахожусь в конце моего острота, почему он не будет работать, когда вызывается напрямую ...

Это было полезно?

Решение 3

На самом деле проблема не связана с экспортом в 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 было решением:

общий

Другие советы

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

Они обсуждают дополнительный флеш-код HTML

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

общий

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

общий

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top