使用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>");
}
...全文
397 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
  • 打赏
  • 举报
回复
救命啊 以上方法都不灵啊,大神们帮帮我
代码转载自:https://pan.quark.cn/s/11d565366452 【USB转I2C/IIC适配器上位机应用程序】是一种针对I2C(Inter-Integrated Circuit)通信协议而构建的工具,其通过USB端口将个人计算机转变为能够与I2C设备进行交互的控制器。该适配器使开发人员与工程师能够便捷地对遵循I2C协议的芯片执行读取和写入任务,因此在硬件构建和测试阶段能够显著提升效率,对于核实I2C接口芯片的工作性能具有特别的价值。 I2C协议是由飞利浦(现NXP半导体)于1980年代初创立的一种双线式串行总线,其目的是用于连接微控制器及其他外围设备。该协议仅需两条信号线(SDA - 数据线,SCL - 时钟线)即可完成多设备间的通信,大幅度削减了电路板上的布线需求,从而降低了生产成本。I2C协议提供多种速度等级,涵盖标准模式(100kbps)、快速模式(400kbps)以及高速模式(3.4Mbps),旨在满足不同场景下的应用要求。 Ginkgo USB转I2C适配器是这项技术的具体应用实例,它提供了一个物理接口,用于将USB端口转换为I2C端口。适配器内部装配有一个微控制器单元,该单元负责处理从USB到I2C的信号转换,并且通过USB线路向计算机传输信息,同时接收来自计算机的指令以操控I2C总线。这种设计使用户无需具备深厚的硬件知识,仅需借助上位机软件即可实现对I2C设备的操控。 Ginkgo I2C Adapter Classic是与该适配器相配套的软件,通常包含以下几项核心功能: 1. 设备识别:自动检测并建立与USB转I2C适配器的连接。 2. 总线探查:扫描I2C总线上所连接的设备地址,有助于准确定位设备的位置。 3. 读写指令...
代码转载自:https://pan.quark.cn/s/4c053f9292d9 在Android应用程序的设计与实现过程中,有时需要借助C或C++语言所具备的高性能特点,此时就必须借助Android Studio的NDK(Native Development Kit)工具来对C/C++代码进行编译,进而生成SO(Shared Object)动态链接库文件。本篇文章将详尽阐述在Android Studio环境下如何执行这一流程。 我们首先需要掌握Android Studio项目的基本组织架构。在Android Studio的`app`文件夹内,存在一个名为`src`的子文件夹,该文件夹通常包含了`main`以及其他相关源代码目录。在`main`文件夹中,除了我们常见的`java`文件夹外,还设立了一个`jniLibs`文件夹,此文件夹专门用于存储SO文件。除此之外,还有一个`jni`文件夹,它是用来存放C/C++源代码的地方。 为了实现C/C++代码的编写与编译,我们必须在`build.gradle`文件中配置NDK的支持。打开`app/build.gradle`文件,在`defaultConfig`部分中嵌入以下内容: ```groovy externalNativeBuild { ndkBuild { path src/main/jni/Android.mk } } ``` 这段内容明确指示Android Studio去何处寻找`Android.mk`文件,该文件是一种Makefile的变体,主要用于设定编译规则和编译目标。 接下来,我们需要创建`Android.mk`文件。在这个文件中,我们将明确指定源代码文件、编译选项以及要生成的库名称。一个基础的...
内容概要:本文围绕麦克斯韦旋度方程的差分形式在平面极化磁场中的应用展开深入研究,并通过Matlab代码实现相关数值仿真。研究的核心是将经典的麦克斯韦方程组转化为适用于数值计算的有限差分格式,构建离散化数学模型,进而模拟和分析平面极化条件下磁场的空间分布特征与时间演化规律。文中系统阐述了差分方法的理论基础与数学推导过程,详细说明网格划分、边界条件设定及迭代求解策略,最终利用Matlab编程实现电磁场的可视化仿真,有效验证了差分方法在求解复杂电磁场问题中的准确性与可行性。该研究不仅加深了对电磁波传播机理的理解,也为电磁器件的设计优化与工程仿真提供了可靠的数值分析手段。; 适合人群:具备电磁场与电磁波理论基础,熟悉偏微分方程数值解法,且掌握Matlab编程技能的电气工程、物理学、应用数学等领域的研究生、科研人员及工程技术人员。; 使用场景及目标:①深入掌握麦克斯韦旋度方程的有限差分法基本原理及其在二维平面磁场仿真中的具体实施步骤;②学习如何利用Matlab进行电磁场问题的建模、编程求解与结果可视化;③为后续开展更复杂的电磁兼容、天线设计或光子晶体等领域的数值模拟研究奠定坚实的技术基础。; 阅读建议:建议读者结合经典电磁场理论教材,透彻理解麦克斯韦方程组的物理内涵,然后循序渐进地跟进文中的差分格式推导过程,务必动手复现并调试所提供的Matlab代码,通过调整参数观察仿真结果的变化,从而深刻领悟数值方法的实质与应用技巧。

62,271

社区成员

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

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

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

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