我在转换为我找到的 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 的按钮的用户控件中调用此类。这按预期工作 - 单击按钮,您将看到一个下载选项,可以打开或保存包含来自 GridView 的数据的生成的 excel 电子表格。
但是,当我从不同的 GridView 中的链接按钮调用它时,我想构建一个动态的 gridview 来包含数据并将其导出。当我这样做时,我从类中的 Response.End 调用中得到一个 ThreadAbortException。
问题 1:为什么从用户控件中调用相同的代码时,我没有收到 ThreadAbortException?用户控件是否有自己的线程或其他类型的上下文?
在发生 ThreadAbortException 时搜索我得到的错误导致我尝试用 ApplicationInstance.CompleteRequest() 替换它。当我这样做时,我不再得到 ThreadAbortException,但这会破坏以前工作的用户控件 - 而不是生成的包含来自网格的数据的 excel 电子表格,它包含来自包含页面的 HTML,并且无论如何它很容易抑制该错误带有空捕获。但是,它不能修复使用动态生成的 GridView 的直接调用,该代码会呈现 javascript 错误:“无法解析从服务器接收到的消息。”
我很想了解这里到底发生了什么,但无论理解如何,我都需要结果。我尝试过的所有其他方法(datagrid 而不是 GridView 等)都遇到了同样的问题,并且在归结为“接管”当前响应并使用 stringwriter 和 htmlwriter 将数据呈现到使用 excel contentType 响应。而且由于这在用户控件的上下文中可以证明是有效的,所以我不知道为什么直接调用它时它不起作用......