web开发——写一个简单的表格导出操作
一、前台页面:
主要是一个按钮和一个表格,表格有显示数据,按钮负责将表格中的数据选择性地导出。除此外,可以附加一个小窗口和进度条,用于显示下载进度。
1. 按钮:<a href="javascript:;" class="easyui-linkbutton" iconCls="icon-redo" data-options="plain:true" id="btn-exp" onclick="fun_export()">导出详细信息</a>
2.表格:<div id="dataGrid" style="margin-bottom:5px;margin-top:1px">
<table id="dg" data-options="toolbar:'#tb'"></table>
</div>
3.进度条和小窗口
<div id="win" class="easyui-window" title="下载中" style="width: 500px; height: 80px" data-options="iconCls:'icon-save',modal:true">
<div id="p" class="easyui-progressbar" data-options="value:10" style="width:400px;margin-top:10px;margin-left:50px;"></div>
</div>
4.下载框:<iframe id="bgfileDownFrame" src="" style="display:none; visibility:hidden;"></iframe>
二、jS请求
<script>
function fun_export(){
$('#win').window('open');
setProgress();
//AJAX请求
$.ajax({
url:'${pageContext.request.contextPath}/media/getExl.action', //TODO
data:{},
type: 'post',
dataType:"json",
success: function(data){
// alert("导出!!!!!");
if(data.isSuccess == "true"){
$("#bgfileDownFrame").attr("src","${pageContext.request.contextPath}/media/downloadExl.action?docToken="+data.token);
value = 100;
setProgress();
$('#win').window('close');
}
else{
$('#win').window('close');
alert("生成统计表出错!");
}
},
});
}
//设置进度条的值
function setProgress(){
var value = $('#p').progressbar('getValue');
if (value < 100){
value += Math.floor(Math.random() * 20);
$('#p').progressbar('setValue', value);
setTimeout(arguments.callee, 200);
}
} </script>
三、action请求方法:
@Action(value="getExl")
public String getExl(){
Map<String,String> result = new HashMap<String,String>();
result.put("isSuccess", "false");
/* 数据来源*/
Map<String, Object> dataMap = new HashMap<String, Object>();//导出结果
List<Map<String, Object>> resultTable1 = mediaManageBPO.getMediaInfo();
dataMap.put("rows", resultTable1);
//路径
String webPath = this.request.getSession().getServletContext().getRealPath("");
MDoc mdoc = new MDoc();
try {
String tmpFileDir = webPath + File.separator +"docTemplate";
//检查临时文件夹是否存在
Util.checkDirExist(tmpFileDir);
//20161227105212956742620
String fileToken = Util.generateTmpFileName(tmpFileDir);
//fileToken 是生成的临时文件名
String docTemplatePath = webPath + File.separator +"docTemplate" + File.separator + fileToken;
//media.ftl是模板文件,先根据xls文件--另存为xml文件--eclipse下再重命名为ftl文件
String templateName = "media.ftl";
mdoc.createXls(dataMap, docTemplatePath,templateName);
result.put("isSuccess", "true");
result.put("token", fileToken);
this.request.getSession().setAttribute("DownloadFile","数据统计表"+UtilsLXJ.getDate());
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
outputJson(result);
return NONE;
}
//下载
@Action(value="downloadExl")
public String downloadExl(){
//数据统计表20161227105333.xls
String downloadName = (String)this.request.getSession().getAttribute("DownloadFile");
if(Util.trim(downloadName).isEmpty()){
downloadName = "数据统计.xls";
}else{
downloadName = downloadName + ".xls";
}
try {
OutputStream os = this.response.getOutputStream();
if (Util.isIE(this.request)) {
downloadName = URLEncoder.encode(downloadName, "utf-8");
} else {
downloadName = new String(downloadName.getBytes("utf-8"),
"iso-8859-1");
}
this.response.setContentType("application/x-download");
this.response.addHeader("Content-Disposition",
"attachment;filename=\"" + downloadName + "\"");
this.response.flushBuffer();
String webPath = this.request.getSession().getServletContext().getRealPath("");
//tmpFileDir临时文件的位置
String tmpFileDir = webPath + File.separator +"docTemplate";
//临时文件后面加上文件token
String bgFile = tmpFileDir + File.separator + docToken;//docToken是从getExl action那里传来的
FileInputStream fis = new FileInputStream(bgFile);
//输出
Util.copyStrem(fis, os);
fis.close();
os.close();
//删除临时文件
Util.delFile(bgFile);
} catch (IOException e) {
e.printStackTrace();
}
return NONE;
}
结果就是如下:

web开发——写一个简单的表格导出操作的更多相关文章
- 用Python写一个简单的Web框架
一.概述 二.从demo_app开始 三.WSGI中的application 四.区分URL 五.重构 1.正则匹配URL 2.DRY 3.抽象出框架 六.参考 一.概述 在Python中,WSGI( ...
- express 写一个简单的web app
之前写过一个简单的web app, 能够完成注册登录,展示列表,CURD 但是版本好像旧了,今天想写一个简单的API 供移动端调用 1.下载最新的node https://nodejs.org/zh- ...
- 动手写一个简单的Web框架(模板渲染)
动手写一个简单的Web框架(模板渲染) 在百度上搜索jinja2,显示的大部分内容都是jinja2的渲染语法,这个不是Web框架需要做的事,最终,居然在Werkzeug的官方文档里找到模板渲染的代码. ...
- 动手写一个简单的Web框架(Werkzeug路由问题)
动手写一个简单的Web框架(Werkzeug路由问题) 继承上一篇博客,实现了HelloWorld,但是这并不是一个Web框架,只是自己手写的一个程序,别人是无法通过自己定义路由和返回文本,来使用的, ...
- 动手写一个简单的Web框架(HelloWorld的实现)
动手写一个简单的Web框架(HelloWorld的实现) 关于python的wsgi问题可以看这篇博客 我就不具体阐述了,简单来说,wsgi标准需要我们提供一个可以被调用的python程序,可以实函数 ...
- 如何用PHP/MySQL为 iOS App 写一个简单的web服务器(译) PART1
原文:http://www.raywenderlich.com/2941/how-to-write-a-simple-phpmysql-web-service-for-an-ios-app 作为一个i ...
- 如何写一个简单的webserver(一):最简实现
本文主要讲述如何用C/C++在Linux环境下写一个简单的支持并发的web服务器,并不考虑服务器的健壮性.安全性.性能等一系列因素. 在本文中,该服务器仅支持GET请求. 项目地址:https://g ...
- 分享:计算机图形学期末作业!!利用WebGL的第三方库three.js写一个简单的网页版“我的世界小游戏”
这几天一直在忙着期末考试,所以一直没有更新我的博客,今天刚把我的期末作业完成了,心情澎湃,所以晚上不管怎么样,我也要写一篇博客纪念一下我上课都没有听,还是通过强大的度娘完成了我的作业的经历.(当然作业 ...
- 开发部署一个简单的Servlet
Servlet是一个执行在服务器端的Java Class文件,载入前必须先将Servlet程序代码编译成.class文件,然后将此class文件放在servlet Engline路径下.Servlet ...
随机推荐
- SQLServer复制(二)--事务代理作业
之前的一篇已经介绍了如何配置复制,介绍了发布者.分发者和订阅者以及事务日志运行的简单关系.其中提到了复制代理,我们这篇将详细介绍复制代理,它是什么?在事务复制的步骤中起到了什么作用? 代理和工作 首先 ...
- 查看C#的dll所依赖.Net版本
Microsoft SDK自带的ildasm.exe工具, 是一个反编译工具, 可以查看编译好后的dll的文件 双击ildasm.exe, 把你要识别的.dll文件拖进来, 就会反编译了. 接着在il ...
- ANDROID中去掉ACTIONBAR或TABWIDGET的分隔线
在android中,有时需要对ActionBar或者TabWidget的分隔线进行定制,如取消,相关的属性设置为android:divider 以TabWidget为例,取消对应的函数: tabWid ...
- NopCommerce Alipay 支付插件
NopCommerce Alipay 支付插件 1.查找及下载NopCommerce Alipay插件 http://www.nopcommerce.com/p/963/alipay-payment- ...
- 匈牙利算法——S.B.S.
匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名.匈牙利算法是基于Hall定理中充分性证明的思想,它是部图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图最 ...
- 【CSS】其他CSS属性和特性
1. 设置元素的颜色和透明度 前面有介绍CSS颜色的各种用法,如 background-color属性.boder-color属性等.还有另外两个与颜色有关的属性. 1.1 设置前景色 color属性 ...
- NOIP2001统计单词个数[序列DP]
题目描述 给出一个长度不超过200的由小写英文字母组成的字母串(约定;该字串以每行20个字母的方式输入,且保证每行一定为20个).要求将此字母串分成k份(1<k<=40),且每份中包含的单 ...
- CH Round #52 还教室[线段树 方差]
还教室 CH Round #52 - Thinking Bear #1 (NOIP模拟赛) [引子]还记得 NOIP 2012 提高组 Day2 中的借教室吗?时光飞逝,光阴荏苒,两年过去了,曾经借教 ...
- SharePoint 2013技巧分享系列 - Active Directory同步显示用户照片
为了保持通讯信息的一致性,需要设置SharePoint,Exchange, Lync等信息同步更新显示,例如,员工头像信息. 本文介绍如何在SharePoint 2013中同步显示Active Dir ...
- break prefab instance的原理
prefab可无限apply: 如果把一个模块做成了prefab,这个prefab可能在同一个scene中添加多个,甚至添加到了多个scene中.设所有这些实例为instance(1),instanc ...