前言
如题,最近也是遇到了一个项目里有导出数据到excel的功能,因为数据量大以及网络原因,经常点击导出按钮后迟迟不响应,对等待的人很不友好,所以建议加一个等待提示框。(本来想加个进度条,奈何有问题一直解决不掉,赶进度只好换成简单的提示框了QAQ)
温馨提示:项目是ssh,所以以下实现基于此。若springboot则根据自己情况替换。
实现
先上前台代码:
exportUrl: apiPrefix + "!excelExport.action?timeZone=",
isExportUrl: apiPrefix + "!isExport.action",
...
/**
@param isExportUrl 是否导出标志的action方法路径
@param exportExcelUrl 导出excel的action方法路径
*/
function do_export(isExportUrl, exportExcelUrl) {
var index = top.layer.alert("数据正在导出中,请耐心等待!", {icon: 16,closeBtn:0,btn:[]});
let d = new Date();
let utc = d.getTimezoneOffset();
let da = 8 * 60 - (-utc);
location.href = exportExcelUrl + da;
// 定时器判断导出进度是否完成
var timer = setInterval(function(){//每隔1秒进行调用该函数
$.ajax({
url:isExportUrl,
success: function(data){
console.log(data);
if(data === "true"){//如果返回的数据是已经成功了说明表格已经加载完成了
layer.closeAll();//关闭所有的提示框
//关闭弹出框
top.layer.close(index);
clearInterval(timer);//清除这个方法
}
},
error:function(e){
console.log("访问失败");
console.log(e.responseText);
}
});
}, 1000);
}
后端代码:
父类BaseAction中:
// 新增获取session对象
public HttpSession getSession() {
return ServletActionContext.getRequest().getSession();
}
// 成功
public void writeWithUtf8(String str) {
try {
HttpServletResponse response = ServletActionContext.getResponse();
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
this.write(str);
} catch (Exception e) {
log.error(e,e);
}
}
// 输出响应
public void write(String str) throws Exception {
HttpServletResponse response = this.getResponse();
response.getWriter().write(str);
response.getWriter().flush();
response.getWriter().close();
}
——子类xxInfoAction里isExport方法——:
// 新增一个通用获取是否导出完毕方法,session中存入一个exportedFlag标志
public void isExport() {
Object exportedFlag = super.getSession().getAttribute("exportedFlag");
if (exportedFlag == null) {
logger.info("已经导出完毕");
super.writeWithUtf8("true");
}else {
// logger.info("还未导完");
super.writeWithUtf8("false");
}
}
——子类xxInfoAction里excelExport方法——:
public String excelExport() {
// 导出前设置session中exportedFlag任意值,导出后清空
super.getSession().setAttribute("exportedFlag", "false");
HSSFWorkbook workbook = new HSSFWorkbook();
try {
...//导出完毕了
super.getSession().removeAttribute("exportedFlag");
return filename;
} catch (Exception e) {
e.printStackTrace();
log.error(e);
} finally {
try {
workbook.close();
} catch (Exception e) {
log.error(e);
}
}
return null;
}
附:springboot里进度条实现:实现文件导出,写入等进度条实时显示
over~