我有一个绑定到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块,我无法弄清楚抛出了什么错误消息。
答案 0 :(得分:9)
答案 1 :(得分:5)
我尝试使用HttpContext.Current.ApplicationInstance.CompleteRequest
。它确实有效,但也在下载文件的末尾导出了页面的完整HTML代码,这是不可取的。
Response.BuffferOutput = True;
Response.Flush();
Response.Close();
然后经过一番努力,我碰到了上面的代码。并且它在下载文件的末尾没有任何异常或不需要的代码,完美地工作。
答案 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();