0

我是 .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 个小时,但没有任何效果。

然后我尝试选择Debug -> Exceptions菜单项,并在出现的对话框中选中“Common Language Runtime Exceptions,

我收到此错误:

拒绝访问路径“C:\Users\abcd\AppData\Local\Temp\Temporary ASP.NET Files\mark\3f229106\f785abea\App_Web_0h5ppn4m.dll”。

4

2 回答 2

5

是的,它会因为这个而发生:

Response.End();

记载

为了模仿 ASP 中 End 方法的行为,此方法尝试引发 [ThreadAbortException] 异常。如果此尝试成功,调用线程将被中止,这对您站点的性能不利。在这种情况下,调用 End 方法后不会执行任何代码。

所以你的Response.Clear电话是没有意义的——你应该期望看到ThreadAbortException,在这种情况下你可以忽略它。

如果你需要打电话Response.Clear 应该在你写信之前 - 但我怀疑你可以完全删除它。

于 2013-10-02T07:17:00.100 回答
0

首先,我会使用像EPPlus (GPL) 这样的 excel 库,我强烈推荐它。

然后就像这样简单地创建真正的 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.EndClear应该是第一个和End 最后一个:

try {
    Response.Clear();
    // ...
} catch (Exception ex) {
    //log error
}
// use HttpContext.Current.ApplicationInstance.CompleteRequest(); instead  
Response.End();  

HttpResponse.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. */
}

GridView 必须放在带有 runat="server" 的表单标签内,即使 GridView 位于表单标签内


编辑

但是Response.End你可以使用HttpContext.Current.ApplicationInstance.CompleteRequest();

http://scottstoecker.wordpress.com/2012/01/12/fixing-threadabortexception-when-using-response-end/

于 2013-10-02T07:17:17.347 回答