我是.net的新手, 我使用以下代码从gridview转移到excel:
protected void toexcelbutton_Click(object sender, EventArgs e)
{
Response.ClearContent();
Response.Buffer = true;
Response.AddHeader("content-disposition", string.Format("attachment; filename={0}", "attendancedatereport.xls"));
Response.ContentType = "application/ms-excel";
StringWriter sw = new StringWriter();
HtmlTextWriter htw = new HtmlTextWriter(sw);
GridView1.AllowPaging = false;
GridView1.AllowSorting = false;
GridView1.DataBind();
HtmlForm htmfrm = new HtmlForm();
GridView1.Parent.Controls.Add(htmfrm);
htmfrm.Attributes["runat"] = "server";
htmfrm.Controls.Add(GridView1);
htmfrm.RenderControl(htw);
Response.Write(sw.ToString());
HttpContext.Current.ApplicationInstance.CompleteRequest();
}
当我运行此代码时,我得到一个例外:
mscorlib.dll中出现'System.Threading.ThreadAbortException'类型的第一次机会异常。
但是,当我在另一个页面中为另一个gridview运行相同的代码时,它运行得很好。我试过,添加
EnableEventValidation="false"
到aspx页面,
<pre lang="cs">public override void VerifyRenderingInServerForm(Control control)
{
/* Verifies that the control is rendered */
}</pre>
到aspx.cs页面,
我尝试清除临时文件,但是我得到了相同的错误,我尝试了超过5小时,没有任何工作。
然后我尝试选择调试 - &gt; 例外菜单项,在显示的对话框中,选中“公共语言运行时例外”的第一个复选框,
我收到此错误:
拒绝访问路径'C:\ Users \ abcd \ AppData \ Local \ Temp \ Temporary ASP.NET Files \ mark \ 3f229106 \ f785abea \ App_Web_0h5ppn4m.dll'。
答案 0 :(得分:5)
是的,它会因此而发生:
Response.End();
作为documented:
为了模仿ASP中End方法的行为,此方法尝试引发[ThreadAbortException]异常。如果此尝试成功,则调用线程将被中止,这对您站点的性能不利。在这种情况下,执行End方法调用后没有代码。
因此,您的Response.Clear
来电毫无意义 - 您应该期待看到ThreadAbortException
,在这种情况下您可以忽略这一点。
如果你需要在所有上致电Response.Clear
,那应该在你写信之前 - 但我怀疑你可以完全删除它。
答案 1 :(得分:0)
首先,我会使用像EPPlus(GPL)这样的excel-ibrary,我可以热烈推荐。
然后创建真实的excel文件并将其写入Response
就像这样容易,例如:
Dim pck = New ExcelPackage()
Dim ws = pck.Workbook.Worksheets.Add("Worksheet-Name")
ws.Cells("A1").LoadFromDataTable(dt, True, OfficeOpenXml.Table.TableStyles.Medium1)
Response.Clear()
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
Response.AddHeader("content-disposition", "attachment; filename=ExcelFileName.xlsx")
Response.BinaryWrite(pck.GetAsByteArray())
这是另一个例子:http://epplus.codeplex.com/wikipage?title=WebapplicationExample
反转Response.Clear
+ Response.End
,Clear
应该是第一个,而End
应该是最后一个:
try {
Response.Clear();
// ...
} catch (Exception ex) {
//log error
}
// use HttpContext.Current.ApplicationInstance.CompleteRequest(); instead
Response.End();
将所有当前缓冲的输出发送到客户端,停止执行 页面,并引发EndRequest事件。
请注意,如果您尝试渲染VerifyRenderingInServerForm
,也应该使用覆盖GridView
来避免异常。
public override void VerifyRenderingInServerForm(Control control)
{
/* Confirms that an HtmlForm control is rendered for the specified ASP.NET
server control at run time. */
}
修改强>:
但您可以使用Response.End
代替HttpContext.Current.ApplicationInstance.CompleteRequest();
:
http://scottstoecker.wordpress.com/2012/01/12/fixing-threadabortexception-when-using-response-end/