Экспорт в Excel - ThreadabortException
-
29-10-2019 - |
Вопрос
У меня проблема с преобразованием в код 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
Это объясняет исключение ThreadAbortException и ошибку «… не удалось проанализировать».Добавление этого в OnPreRender ImageButton было решением:
общийДругие советы
Попробуйте вместо этого: HttpApplication.CompleteRequest () согласно: http://www.c6software.com/codesolutions/dotnet/threadabortexception.aspx
Они обсуждают дополнительный флеш-код HTML
используйте это
общийвместо gridview1 вы можете использовать div
общийСобытие, при котором вызывается код экспорта в Excel, должно выполнять полную обратную передачу.проблема в том, что он выполняет только частичную обратную передачу.
У меня была такая же ошибка, и она была решена, когда я сделал полную обратную передачу.
Надеюсь, это кому-то поможет.