导出到excel时线程被中止了吗?

时间:2009-01-07 17:21:32

标签: c# asp.net exception

我有一个绑定到GridView的DataTable。我还有一个按钮,单击时将DataTable导出到Excel文件。但是,发生以下错误:

ErrMsg =“线程正在中止。”

以下是抛出错误的代码的一部分:

private static void Export_with_XSLT_Web(DataSet dsExport, 
                                         string[] sHeaders,
                                         string[] sFileds, 
                                         ExportFormat FormatType,
                                         string FileName)
{
    try
    {
        // Appending Headers
        HttpContext.Current.Response.Clear();
        HttpContext.Current.Response.Buffer = true;

        if(FormatType == ExportFormat.CSV)
        {
            HttpContext.Current.Response.ContentType = "text/csv";
            HttpContext.Current.Response.AppendHeader("content-disposition",
                                                      "attachment; 
                                                      filename=" + FileName);
        }
        else
        {
            HttpContext.Current.Response.ContentType = "application/vnd.ms-excel";
            HttpContext.Current.Response.AppendHeader("content-disposition", 
                                                      "attachment; 
                                                      filename=" + FileName);
        }

        // XSLT to use for transforming this dataset.                       
        MemoryStream stream = new MemoryStream();
        XmlTextWriter writer = new XmlTextWriter(stream, Encoding.UTF8);

        CreateStylesheet(writer, sHeaders, sFileds, FormatType);
        writer.Flush();
        stream.Seek(0, SeekOrigin.Begin);

        XmlDataDocument xmlDoc = new XmlDataDocument(dsExport);
        //dsExport.WriteXml("Data.xml");
        XslTransform xslTran = new XslTransform();
        xslTran.Load(new XmlTextReader(stream), null, null);

        using(StringWriter sw = new StringWriter())
        {
            xslTran.Transform(xmlDoc, null, sw, null);

            //Writeout the Content              
            HttpContext.Current.Response.Write(sw.ToString());                
            writer.Close();
            stream.Close();
            HttpContext.Current.Response.End();
        }
    }
    catch(ThreadAbortException Ex)
    {
        string ErrMsg = Ex.Message;
    }
    catch(Exception Ex)
    {
        throw Ex;
    }
    finally
    {

    }
}

将HttpContext.Current.Response.End更改为HttpContext.Current.ApplicationInstance.CompleteRequest之后,它现在只是转到finally块,我无法弄清楚抛出了什么错误消息。

5 个答案:

答案 0 :(得分:9)

从以下行抛出ThreadAbortException:

HttpContext.Current.Response.End();

这里有更多details和解决方法。

答案 1 :(得分:5)

我尝试使用HttpContext.Current.ApplicationInstance.CompleteRequest。它确实有效,但也在下载文件的末尾导出了页面的完整HTML代码,这是不可取的。

Response.BuffferOutput = True;
Response.Flush();
Response.Close();

然后经过一番努力,我碰到了上面的代码。并且它在下载文件的末尾没有任何异常或不需要的代码,完美地工作。

Source

答案 2 :(得分:0)

该异常是由Response.End

引起的

您可以做的一件事就是逻辑地捕获异常消息......

此方法不会影响数据,但只会捕获异常......

Try

    .........(codes here)
    Response.End

Catch ex as Message

    If Not ex.Message = "Thread was being aborted." Then
         Response.write(ex.message)
    End If

End Try

答案 3 :(得分:0)

我在这里有不同的故事,我正在使用 telerik 控件,NONE帮助了我,最终我知道我必须将我的标记包装在 telerik:RadAjaxPanel ,下面是在RequestStart客户端事件处理程序上禁用ajax的代码片段。

<telerik:RadAjaxPanel runat="server" 
    ClientEvents-OnRequestStart="AjaxRequestStart">

然后在我的用户控件中,我添加了另外一个函数,如下所示:

<script type="text/javascript">
    function AjaxRequestStart(target, arguments) {
        arguments.set_enableAjax(false);
}

答案 4 :(得分:-1)

简单,你可以尝试:

Response.Close();代替Response.End();