У меня проблема с преобразованием в код 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. И так как это явно работает в контексте пользовательского контроля, я нахожусь в своем уме, почему он не будет работать при непосредственном вызове ...