我遇到了转换为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调用此类,该usercontrol包含一个添加到页面上显示的GridView的按钮。这按预期工作 - 单击按钮,您将看到一个下载选项,以打开或保存包含GridView数据的结果excel电子表格。
然而,当我从另一个GridView中的链接按钮调用它时,我想构建一个动态gridview来包含数据并导出它。当我这样做时,我从类中的Response.End调用中得到一个ThreadAbortException。
问题1:为什么在usercontrol中调用相同的代码时,我没有得到ThreadAbortException?用户控件是否有自己的线程或其他类型的上下文?
搜索发生ThreadAbortException时得到的错误导致我尝试用ApplicationInstance.CompleteRequest()替换它。当我这样做时,我不再获得ThreadAbortException,但这打破了以前工作的用户控件 - 而不是包含来自网格的数据的结果excel电子表格,它包含来自包含页面的HTML,并且无论如何它很容易抑制带有空捕获的错误。但是,它没有修复动态生成的GridView的直接调用,该代码呈现javascript错误:“无法解析从服务器收到的消息。”
我很想知道这里到底发生了什么,但我不管理解如何都需要结果。我尝试过的所有其他方法(datagrid而不是GridView等)遇到了同样的问题,当它归结为“接管”时基本相同 当前响应并使用stringwriter和htmlwriter将数据呈现为具有excel contentType的响应。而且,由于这可以在用户控制的情况下工作,所以我最终知道为什么直接调用时它不起作用...
答案 0 :(得分:0)
尝试改为: HttpApplication.CompleteRequest() 按照: http://www.c6software.com/codesolutions/dotnet/threadabortexception.aspx
他们讨论了另外的html正在建立
答案 1 :(得分:0)
使用此
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
答案 2 :(得分:0)
问题实际上与excel导出完全无关。 “......无法解析”错误是关键。从这些链接中我得到了密钥,即网格事件仅导致部分回发事件:
http://forums.asp.net/t/1392827.aspx
这解释了ThreadAbortException和“......无法解析”错误。将此添加到ImageButton的OnPreRender是解决方案:
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);
}
}
答案 3 :(得分:0)
调用Export to excel代码的事件必须进行完整的回发。问题是因为它只进行了部分回发。
我遇到了同样的错误,当我完成回发后它就解决了。
希望这有助于某人。