使用HttpResponse做Execl导出后,Response.Write中写alert不好用了

司徒彦 2014-11-24 11:13:12
如题,使用HttpResponse做Execl导出后,由于数据量过大,加载慢,做了一个遮盖,挡住后面页面,想在数据加载完成后,在后台调用JS隐藏掉遮蔽,但是Response.Write中写alert不好用了,没有反应,请大神们帮帮忙!

protected void LinkButton1_Click(object sender, EventArgs e)
{
DataSet ds = new DataSet();
LoginSession model = Session["LoginSession"] as LoginSession;
string DBType = ConfigurationManager.AppSettings["DBtype"];
if (DBType == "ora")
{
ds = DbHelperOra.Query(refsql, model.getJndiName());
}
else
{
ds = DbHelperSQL.Query(refsql, model.getJndiName());
}
//Page.RegisterStartupScript("asddas", "<script>hideDiv('pop-div');</script>");
//ClientScript.RegisterStartupScript(ClientScript.GetType(), "asddas", "<script>alert('1');$(\"#mask\").remove();$(\"#pop-div\").animate({left: 0, top: 0, opacity: \"hide\" }, \"slow\");</script>");
exportToExcel(ds.Tables[0], "收集整编");
Response.Write("<script>alert('导出成功!');</script>");
}


///
/// 将DataTable导入到Excel中
///
/// 数据源
/// 目标Excel
public void exportToExcel(DataTable dt, string Title)
{
string strRealFile = HttpUtility.UrlEncode(Title, System.Text.Encoding.UTF8);
HttpResponse resp = System.Web.HttpContext.Current.Response;
string ExcelName = strRealFile + DateTime.Now.ToString("yyyyMMddHHmmss");
resp.ContentEncoding = System.Text.Encoding.GetEncoding("UTF-8");
resp.AppendHeader("Content-Disposition", "attachment;filename=" + ExcelName + ".xls");
string colHeaders = "", ls_item = "";
DataRow[] myRow = dt.Select();//可以类似dt.Select("id>10")之形式达到数据筛选目的
int i = 0;
int cl = dt.Columns.Count;
//取得数据表各列标题,各标题之间以t分割,最后一个列标题后加回车符
//resp.Write("<html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" /></head><body><table border=1><tr ");
//添加网格
resp.Write("<html xmlns:x=\"urn:schemas-microsoft-com:office:excel\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />" +
"<!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>123</x:Name><x:WorksheetOptions><x:Print><x:ValidPrinterInfo /></x:Print></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--></head><body><table><tr ");
List<int> countnum = new List<int>();
List<string> countname = new List<string>();
for (i = 0; i < cl; i++)
{
for(int k=0;k<ds1_print.Tables[0].Rows.Count;k++)
{
if (dt.Columns[i].Caption.ToString() == ds1_print.Tables[0].Rows[k]["FIELDNAME"].ToString())
{
countnum.Add(i);
countname.Add(ds1_print.Tables[0].Rows[k]["FIELDNAME"].ToString());
}
}
}
for (int k = 0; k < countname.Count; k++)
{
for (i = 0; i < dt.Columns.Count; i++)
{
if (countname[k]==dt.Columns[i].Caption.ToString())
{
string newname = ds1_print.Tables[0].Select("FIELDNAME='" + dt.Columns[i].Caption.ToString() + "'")[0]["DISPNAME"].ToString();
colHeaders += "<th>" + newname + "</th>";
}
}
}
resp.Write(colHeaders + "</tr>");
//向HTTP输出流中写入取得的数据信息
//逐行处理数据
foreach (DataRow row in myRow)
{
//当前行数据写入HTTP输出流,并且置空ls_item以便下行数据
ls_item = "<tr>";

for (int k = 0; k < countname.Count; k++)
{
for (i = 0; i < cl; i++)
{

if (countname[k] == dt.Columns[i].Caption.ToString())
{
if (countname[k] == "FLH" || countname[k] == "CWRQ" || countname[k] == "PSRQ" || countname[k] == "GDRQ" || countname[k] == "PRJCODE")
{
if (i == (cl - 1))//最后一列,加n
{
ls_item += "<td>'" + row[i].ToString() + "</td></tr>";
}
else
{
ls_item += "<td>'" + row[i].ToString() + "</td>";
}
}
else
{
if (i == (cl - 1))//最后一列,加n
{
ls_item += "<td>" + row[i].ToString() + "</td></tr>";
}
else
{
ls_item += "<td>" + row[i].ToString() + "</td>";
}
}
}
}
}
resp.Write(ls_item);
}
resp.Write("</table></body></html>");
//resp.Write("<script>alert('导出成功!');</script>");
resp.End();
//Response.Write("<script>alert('导出成功!');</script>");
}
...全文
354 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
webdiyer 2014-11-26
  • 打赏
  • 举报
回复
引用 12 楼 yannanlee724 的回复:
[quote=引用 7 楼 webdiyer 的回复:] 问题在这句:resp.AppendHeader("Content-Disposition", "attachment;filename=" + ExcelName... 也就是导出时当前http响应类型根本不是普通网页的text/html类型了,你的任何html代码都不可能被运行了
大哥 怎么解决呢[/quote] 导出放在一个隐藏的iframe中,这样不影响当前页面上脚本的运行
  • 打赏
  • 举报
回复
最好还是将导出的方法写到单独的ashx中,利用ajax回调来弹提示
  • 打赏
  • 举报
回复
因为导出方法的最后就结束响应了resp.End(); 去掉吧
webdiyer 2014-11-24
  • 打赏
  • 举报
回复
问题在这句:resp.AppendHeader("Content-Disposition", "attachment;filename=" + ExcelName... 也就是导出时当前http响应类型根本不是普通网页的text/html类型了,你的任何html代码都不可能被运行了
WM_JAWIN 2014-11-24
  • 打赏
  • 举报
回复
你这完全就是不合理的做法。不管你怎么输出,都会直输出到你的xls文件里。 或许,你可以把Response.BufferOutput =false关闭输出缓存,这样就可以一边生成,一边下载,感觉不到等待
司徒彦 2014-11-24
  • 打赏
  • 举报
回复
引用 4 楼 hnsycsj 的回复:
首先你对后台Response.Write输出JS的生命周期没清楚,在asp.net后台输出Js必须页面完全加载完才输出。
我这个页面有一个导出Excel按钮,点击导出后弹出一个DIV进行遮蔽,之后开始调用后台事件,就是我上面贴出的两个方法,我理想的情况是加载完方法后弹出一个导出成功,或者回传刷新页面,但是都做不到,其他页都没问题,所以我怀疑是不是HttpResponse搞的鬼,现在就是不知道问题出在哪,该怎么解决
hnsycsj 2014-11-24
  • 打赏
  • 举报
回复
首先你对后台Response.Write输出JS的生命周期没清楚,在asp.net后台输出Js必须页面完全加载完才输出。
司徒彦 2014-11-24
  • 打赏
  • 举报
回复
引用 2 楼 u010349035 的回复:
Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "ok", "alert('导出成功!')",true);
不行啊,还是不好使。。。。
-烟花雨季 2014-11-24
  • 打赏
  • 举报
回复
Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "ok", "alert('导出成功!')",true);
司徒彦 2014-11-24
  • 打赏
  • 举报
回复
代码中写的几个.Write("<script>alert('导出成功!');</script>");都不好用 请大神们帮看看!谢谢
hnsycsj 2014-11-24
  • 打赏
  • 举报
回复
引用 5 楼 yannanlee724 的回复:
[quote=引用 4 楼 hnsycsj 的回复:] 首先你对后台Response.Write输出JS的生命周期没清楚,在asp.net后台输出Js必须页面完全加载完才输出。
我这个页面有一个导出Excel按钮,点击导出后弹出一个DIV进行遮蔽,之后开始调用后台事件,就是我上面贴出的两个方法,我理想的情况是加载完方法后弹出一个导出成功,或者回传刷新页面,但是都做不到,其他页都没问题,所以我怀疑是不是HttpResponse搞的鬼,现在就是不知道问题出在哪,该怎么解决[/quote] 我说的你还不明白么?意思你JS不要放在后台输出,写在JS文件里面或者写在ASPX页面里面,当你点击按钮的时候先调用JS! 你放在后台做JS输出永远是页面完全加载完才会调用JS,这是.net页面的生命周期。
司徒彦 2014-11-24
  • 打赏
  • 举报
回复
引用 7 楼 webdiyer 的回复:
问题在这句:resp.AppendHeader("Content-Disposition", "attachment;filename=" + ExcelName... 也就是导出时当前http响应类型根本不是普通网页的text/html类型了,你的任何html代码都不可能被运行了
大哥 怎么解决呢
司徒彦 2014-11-24
  • 打赏
  • 举报
回复
救命啊 以上方法都不灵啊,大神们帮帮我

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧