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();
}

このコードを実行すると、例外が発生します。

タイプ 'System.Threading.ThreadAbortException' の初回例外が mscorlib.dll で発生しました。

しかし、別のグリッドビューの別のページで同じコードを実行すると、完全に機能します。

EnableEventValidation="false"

aspx ページに移動し、

<pre lang="cs">public override void VerifyRenderingInServerForm(Control control)
{
   /* Verifies that the control is rendered */
}</pre>

aspx.cs ページに、

一時ファイルをクリアしようとしましたが、それでも同じエラーが発生します.5時間以上試しましたが、何も機能していません.

次に、[デバッグ] -> [例外] メニュー項目を選択してみました。表示されるダイアログで、「共通言語ランタイム例外」の最初のチェックボックスをオンにしました。

私はこのエラーが発生します:

パス「C:\Users\abcd\AppData\Local\Temp\Temporary ASP.NET Files\mark\3f229106\f785abea\App_Web_0h5ppn4m.dll」へのアクセスが拒否されました。

4

2 に答える 2

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();  

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" を使用してフォーム タグ内に配置する必要があります。


編集

ただし、代わりに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 に答える