如何在Excel导出时加一个提示框
(1) 问题描述
Excel导出的时候由于数据量较大,加上项目用的数据库和外网不在同一个局域网内,导致导出数据的时候速度很慢。最后客户要求,在导出的时候加上一个提示框,当导出完毕后,提示框自动消失。
这个问题比较棘手,因为导出数据的时候Action给前台返回的是流而不是文本,所以页面不会跳转,无论你Action里有没有配置跳转的页面地址,都不会跳转。
(2) 解决方案
步骤一: 在js中设置一个标志位,Excel导出的Action提交前给一个默认的初始值“0”,显
示提示框。
步骤二: 当Excel导出数据后把标志位设置为“1”,该标志位为Action的成员变量
步骤三: 另外在导出Excel方法所在的Action中增加一个方法,改方法的作用是查看标志位
的值有没有改变。
步骤四: 当Excel导出的form表单提交后,用ajax每3秒向请求查看标志位的Action
步骤五: 发现标志位的值发生改变后,ajax可以接受到成功的信息,最后把提示框隐藏。
(3) 代码
前台页面代码:
var tIfRun = '${ifRun}';
function exportExcel(){
var exportTtype = $('#select option:selected') .val();;
var type0 = document.getElementById("type0").value;
var type1 = document.getElementById("type1").value;
var type2 = document.getElementById("type2").value;
//显示提示框
document.getElementById("tc").style.display="block";
document.getElementById("bg").style.display="block";
document.getElementById("myForm").submit();
tIfRun='1';
}
function timeCallBack() {
if(tIfRun == '1') {
htmlobj = $.ajax({url:"<%=basePath%>timeCallBack.action", async:false, type:"POST"});
if(htmlobj.responseText == 'ok') {
//隐藏提示框
document.getElementById("tc").style.display ="none";
document.getElementById("bg").style.display ="none";
tIfRun = '';
}
}
}
后台:
public void timeCallBack() throws IOException {
HttpServletResponse httpResponse = ServletActionContext.getResponse();
httpResponse.setContentType("text/xml");
httpResponse.setHeader("Content-Type", "text/xml; charset=UTF-8");
httpResponse.setHeader("Cache-Control", "no-cache, must-revalidate");
PrintWriter out = httpResponse.getWriter(); // 定义一个输出流
if (!"1".equals(LockIndex.getInstance().getIndexRunFlag())) {
out.print("ok");
}
注意:timeCallBack() 方法和导出的方法都是放在同一个ExportAction.ava文件中的,标志位为
ExportAction.ava的成员变量。当然这个程序也可以把提示框改成一个滚动条的样式。
(4) 总结这个程序的精髓之处在于利用了ajax请求了和导出的方法在同一个Action类里的方法,
从而可以根据标志来判断数据有没有导出。