一、前台页面:

主要是一个按钮和一个表格,表格有显示数据,按钮负责将表格中的数据选择性地导出。除此外,可以附加一个小窗口和进度条,用于显示下载进度。

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开发——写一个简单的表格导出操作的更多相关文章

  1. 用Python写一个简单的Web框架

    一.概述 二.从demo_app开始 三.WSGI中的application 四.区分URL 五.重构 1.正则匹配URL 2.DRY 3.抽象出框架 六.参考 一.概述 在Python中,WSGI( ...

  2. express 写一个简单的web app

    之前写过一个简单的web app, 能够完成注册登录,展示列表,CURD 但是版本好像旧了,今天想写一个简单的API 供移动端调用 1.下载最新的node https://nodejs.org/zh- ...

  3. 动手写一个简单的Web框架(模板渲染)

    动手写一个简单的Web框架(模板渲染) 在百度上搜索jinja2,显示的大部分内容都是jinja2的渲染语法,这个不是Web框架需要做的事,最终,居然在Werkzeug的官方文档里找到模板渲染的代码. ...

  4. 动手写一个简单的Web框架(Werkzeug路由问题)

    动手写一个简单的Web框架(Werkzeug路由问题) 继承上一篇博客,实现了HelloWorld,但是这并不是一个Web框架,只是自己手写的一个程序,别人是无法通过自己定义路由和返回文本,来使用的, ...

  5. 动手写一个简单的Web框架(HelloWorld的实现)

    动手写一个简单的Web框架(HelloWorld的实现) 关于python的wsgi问题可以看这篇博客 我就不具体阐述了,简单来说,wsgi标准需要我们提供一个可以被调用的python程序,可以实函数 ...

  6. 如何用PHP/MySQL为 iOS App 写一个简单的web服务器(译) PART1

    原文:http://www.raywenderlich.com/2941/how-to-write-a-simple-phpmysql-web-service-for-an-ios-app 作为一个i ...

  7. 如何写一个简单的webserver(一):最简实现

    本文主要讲述如何用C/C++在Linux环境下写一个简单的支持并发的web服务器,并不考虑服务器的健壮性.安全性.性能等一系列因素. 在本文中,该服务器仅支持GET请求. 项目地址:https://g ...

  8. 分享:计算机图形学期末作业!!利用WebGL的第三方库three.js写一个简单的网页版“我的世界小游戏”

    这几天一直在忙着期末考试,所以一直没有更新我的博客,今天刚把我的期末作业完成了,心情澎湃,所以晚上不管怎么样,我也要写一篇博客纪念一下我上课都没有听,还是通过强大的度娘完成了我的作业的经历.(当然作业 ...

  9. 开发部署一个简单的Servlet

    Servlet是一个执行在服务器端的Java Class文件,载入前必须先将Servlet程序代码编译成.class文件,然后将此class文件放在servlet Engline路径下.Servlet ...

随机推荐

  1. js获取浏览器内核、类型、版本以及系统类型

    正则表达式: var rsys = /\b(windows|win32|macintosh|mac os x|adobeair|linux|unix)\b/; var rkn = /\b(opera| ...

  2. 烂泥:dnsmasq搭建简易DNS服务器

    本文由ilanniweb提供友情赞助,首发于烂泥行天下 想要获得更多的文章,可以关注我的微信ilanniweb. 今天我们来介绍一个比较简单的DNS服务器dnsmasq.这款软件,已经被我成功使用到公 ...

  3. linux下使用tar命令

    解压语法:tar [主选项+辅选项] 文件或者目录 使用该命令时,主选项是必须要有的,它告诉tar要做什么事情,辅选项是辅助使用的,可以选用. 主选项: c 创建新的档案文件.如果用户想备份一个目录或 ...

  4. 追MM的各种算法

    原文:http://blog.sae.sina.com.cn/archives/3542#more-3542 看到一篇文章把算法描述的相当的好,先收藏了! 动态规划 基本上就是说:你追一个MM的时候, ...

  5. .NET 缩略图服务器 ResizingServer

    之前写过一篇文章 .NET 响应式自动缩略图服务器 之后对此Image Server又进行了基于ImageResizer的改写 基于.NET 图片服务器 支持缩略图格式 基于 ImageResizer ...

  6. [django]windows下用Django,静态文件请求失败,出现UnicodeDecodeError

    问题:windows下用Django,静态文件请求失败,出现UnicodeDecodeError:'utf-8' codec can't decode byte 0xb0 in position 1: ...

  7. WPF -Enum的三种绑定方法

    一.使用ObjectDataProvider <Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentat ...

  8. MMORPG大型游戏设计与开发(服务器 游戏场景 聊天管道和寻路器)

    又快到双十一,又是不少同仁们出血的日子,首先希望大家玩的开心.我曾经想要仔细的剖析场景的的每个组件,就像这里的聊天管道与寻路器,但是仔细阅读别人代码的时候才发现元件虽小但是实现并不简单,因为有些东西还 ...

  9. Leetcode: climbing stairs

    July 28, 2015 Problem statement: You are climbing a stair case. It takes n steps to reach to the top ...

  10. Linux Kernel代码艺术——系统调用宏定义

    我们习惯在SI(Source Insight)中阅读Linux内核,SI会建立符号表数据库,能非常方便地跳转到变量.宏.函数等的定义处.但在处理系统调用的函数时,却会遇到一些麻烦:我们知道系统调用函数 ...