支持格式:csv

提供的方法:

数据导出请求

传入参数:

1.传入JDAction(数据库交互组件)支持的json格式的查询条件

2.传入需要导出的列

3.传入导出的格式(目前只支持csv)

4.持续交互超时时间(S)

5.传入导出文件要保存的物理路径

返回导出后数据的文件名

导出进度轮询

传入导出请求时返回的文件名,返回当前导出请求的进度

使用方法.

1.首先调用数据导出请求   传入相应的参数,得到导出文件的下载地址

2.按时轮询导出进度查询方法,查出导出的进度,显示进度条

(如超过数据导出请求时传入的持续交互超时时间,还没有再一次访问导出进度查询方法,数据导出组件则会认为本次导出已中断,自动终止本次导出请求)

ps:

这里面用到了

JDAction,数据库交互工具包,以json格式和数据库交互,基于oracle

JO, json操作工具包

Export.java

    /*** 导出用户调用此接口,请求导出文件传入参数:1.JDAction(数据库交互组件)支持的json格式的查询条件2.需要导出的列    格式:(列名:[导出时候的列名],列名:[导出时候的列名])中括号里的是可选值3.导出的格式(目前只支持csv)4.持续交互超时时间(S)5.导出文件要保存的物理路径返回导出后数据的文件名*/public static String exp(String query,String columns,String format,int outtime,String file, java.sql.Connection conn){/**验证参数**/if ("".equals(query)) { return "false,查询条件不能为空"; }if (!"csv".equalsIgnoreCase(format)) { return "false,只支持csv格式"; }if (outtime <= 0) { outtime = 5; }//持续交互超时时间默认为5S /**生成文件名**/String fileName = java.util.UUID.randomUUID().toString() + ".csv";/**保存請求数据**/data.ExpEntity entity = new data.ExpEntity(query,columns,format,outtime,file + "/" + fileName,System.currentTimeMillis(),System.currentTimeMillis());data.RequestData.map.put(fileName,entity);System.out.println("保存請求数据:" + fileName);System.out.println("data:" + entity.toString());/**启动导出线程**/entity.setExpstart(true);new thread.ExpThread(entity, conn).start();System.out.println("文件:" + entity.toString() + ",导出线程已启动");/**返回下载地址**/return fileName;}public static String getExpSchedule(String fileName) {org.dom4j.Element root = org.dom4j.DocumentHelper.createElement("root");root.addAttribute("return","0");try {data.ExpEntity entity = data.RequestData.map.get(fileName);if (entity == null) {root.addAttribute("return","1");root.setText("无记录");return root.asXML();}entity.setEndGetScheduleTime(System.currentTimeMillis());root.setText(entity.getSum() + "," + entity.getExped());return root.asXML();} catch (Exception e) {root.addAttribute("return","9");root.setText("程序异常:" + e);return root.asXML();}}

ExpThread.java

    /*** 数据导出线程*/public void run() {au.com.bytecode.opencsv.CSVWriter writer = null;try {/**查询数据并写入文件&记录进度**/java.io.File file = new java.io.File(entity.getFile());file.createNewFile();writer = new au.com.bytecode.opencsv.CSVWriter(new java.io.FileWriter(file), ',');//查询json.JO jp = new json.JO(entity.getQuery());json.JO ret = db.JDAction.execute(conn, jp);java.util.List<json.JO> l = ret.getJOArray("rows");//set总数entity.setSum(ret.I("totalcount"));/**写入表头**/Object columns[] = null;if (org.apache.commons.lang.StringUtils.isNotBlank(entity.getColumns())) {columns = entity.getColumns().split(",");} else {columns = l.get(0).keySet().toArray();}String[] title = new String[columns.length];for (int i = 0; i < columns.length; i++) {title[i] = getC((columns[i]+"").split(":"));}writer.writeNext(title);//用于判断是否要继续boolean isContinue = true;String contentArray[] = null;for (int i = 0; i < l.size(); i++) {contentArray = new String[columns.length];if (entity.isExpstart()) {for (int j = 0; j < columns.length; j++) {contentArray[j] = l.get(i).S((columns[j] + "").split(":")[0]);}writer.writeNext(contentArray);/**记录进度**/entity.setExped(entity.getExped() + 1);} else {isContinue = false;break;}}//如果断开终止了,则不必要再继续if (!isContinue) { return; } else {if (entity.getSum() == entity.getExped()) {entity.setExpstart(false);log.info("文件:" + entity.toString() + ",导出线程已终止,总共耗时:XXX毫秒");return;}if ((System.currentTimeMillis() - entity.getEndGetScheduleTime()) > (entity.getOuttime() * 1000 + 2000)) {entity.setExpstart(false);log.info("文件:" + entity.toString() + ",导出线程已终止,总共耗时:XXX毫秒");return;} else {log.info("文件:" + entity.toString() + ",导出线程已耗时:XXX毫秒");}}int pagecount = ret.I("pageinfo.pagecount");for (int k = 1; k < pagecount; k++) {jp.put("pagenumber", k + 1);ret = db.JDAction.execute(conn, jp);l = ret.getJOArray("rows");for (int i = 0; i < l.size(); i++) {contentArray = new String[columns.length];if (entity.isExpstart()) {for (int j = 0; j < columns.length; j++) {contentArray[j] = l.get(i).S((columns[j] + "").split(":")[0]);}writer.writeNext(contentArray);/**记录进度**/entity.setExped(entity.getExped() + 1);} else {isContinue = false;break;}}//如果断开终止了,则不必要再继续if (!isContinue) { break; } else {if (entity.getSum() == entity.getExped()) {entity.setExpstart(false);log.info("文件:" + entity.toString() + ",导出线程已终止,总共耗时:XXX毫秒");break;}if ((System.currentTimeMillis() - entity.getEndGetScheduleTime()) > (entity.getOuttime() * 1000 + 2000)) {entity.setExpstart(false);log.info("文件:" + entity.toString() + ",导出线程已终止,总共耗时:XXX毫秒");break;} else {log.info("文件:" + entity.toString() + ",导出线程已耗时:XXX毫秒");}}}} catch (Exception e) {log.error(entity.getFile() + e);} finally {try { writer.close(); } catch (java.io.IOException e) {log.equals(entity.getFile() + "writer关闭错:" + e);}try { if (conn != null) { conn.close(); } } catch (java.sql.SQLException e) {log.equals(entity.getFile() + "关闭连接错:" + e);}}}

调用例程test.jsp

<%@ page language="java" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Export Demo</title><link rel="stylesheet" type="text/css" href="../jquery-easyui-1.2.6/themes/default/easyui.css"><link rel="stylesheet" type="text/css" href="../jquery-easyui-1.2.6/themes/icon.css"><script type="text/javascript" src="../jquery-easyui-1.2.6/jquery-1.7.2.min.js"></script><script type="text/javascript" src="../jquery-easyui-1.2.6/jquery.easyui.min.js"></script><script>var s_file_name = '';function exp(){$('#p').progressbar('setValue', 0);$.post("test_act.jsp", {op: 'exp'},function(data){s_file_name = data.file_name + ''; test();}, "json"); }function test(){var value = $('#p').progressbar('getValue');if (value < 100){$.post("test_act.jsp", {'op': 'getexp', 's_file_name': s_file_name},function(ret){if (ret.sum == 0) { value = 0; } else {value = Math.floor((ret.exped / ret.sum) * 100);$('#msg').text(ret.sum + "条数据已导出,请点击");}$('#p').progressbar('setValue', value);}, "json"); setTimeout(arguments.callee, 200);} else {$('#dlink').attr("href", '../csvfiles/' + s_file_name);$('#d').attr("style","display: block;");}}</script>
</head>
<body><div style="margin: 10px 0"><a href="#" class="easyui-linkbutton" onclick="exp()">EXPORT</a></div><div id="p" class="easyui-progressbar" style="width:400px; font-size: 12px;"></div><br><div id="d" style="display: none;"><label id="msg"></label><a id="dlink">下载</a></div>
</body>
</html>

例程显示效果图

附完整的源码下载连接,希望大家多多指教

期待下个版本能支持更多文件格式导出和指定导出数量

http://files.cnblogs.com/freeness/exp.rar

转载于:https://www.cnblogs.com/freeness/archive/2012/07/04/export.html

exp4me 用java做的实用的csv导出程序 - 名传无线.freeness.yang相关推荐

  1. 如何复制java卡,使用java做一个简单的集卡程序

    使用java做一个简单的集卡程序 本次设想的是要集齐4张卡,每张卡的概率都是25%,如果每个用户集齐需要多少次才能集合完毕 public class Test { public static void ...

  2. java做 excel文件的 导入导出 (SSM+layer)

    做的项目使用时 Java ssm + 前端layer+ freemark. 因为是从项目中扣的代码.整理了下逻辑. 有问题的下方留言哈 导入的依赖 poi <!-- https://mvnrep ...

  3. 怎么用java做随机选人软件_Java小程序:五人随机选一人并显示姓名

    该程序实现的是用空格键控制五个人编号的滚动(用Timer实现),当选定一个人的时候,显示其名字,具体界面如下: 此程序需要链接数据库,在此用的是Access数据库,数据链接的代码如下: import ...

  4. java求面积_用Java做个计算长方形面积的程序(3)

    11.这是计算长方形的源代码可以直接在进行编译运行,希望大家从中能够获益良多. //载入Scanner类文件. //java.util.Scanner 是 Java5 的新特征,我们可以通过 Scan ...

  5. java实现通话_Java做一个最简单的通话程序

    Java做一个最简单的通话程序 作者:未知    文章来源:www.jspcn.net 发布日期:2005年01月19日 Java中的网络编程是一个很重要的部分,也是其编程优越性的地方之一.在Java ...

  6. 51单片机可以做什么实用的产品?

    我用51的单片机做过不少于10款产品了. 我看到很多文章,说51已经过时了,新手没必要学习51单片机,可以直接学STM32. 我个人认为这种说法存在一定的误导,51还是有很大的市场. 很多人想从事嵌入 ...

  7. java做jsp问题_java/jsp中 中文问题详解

    java/jsp中 中文问题详解 更新时间:2006年10月13日 00:00:00   作者: 预备知识: 1.字节和unicode Java内核是unicode的,就连class文件也是,但是很多 ...

  8. Java导出excel中poi的导出和csv导出excel

    最近在做一个文史类统计项目,许多地方需要用到导出excel报表.之前用的是公司的poi导出,最后听群友说csv的导出会比poi快很多.但是csv文件是以","分割文件的.如果数据中 ...

  9. java sslsocket程序_JAVA与C++进行sslsocket通信,JAVA做服务端或客户端

    前几天有位网友问我关于Unity3D里面使用Protobuf的方法,一时有事拖到现在才写这篇文章,不好意思哈. 本文测试环境: 系统:WINDOWS 7(第3.6步).OS X 10.9(第4步) 软 ...

最新文章

  1. 正则显示手机号显示3 4 4 格式
  2. 2020 年,人工智能和深度学习未来的五大趋势
  3. 不同存储区域的数组分析
  4. 【实用/转载】ALV OO Container屏幕自适应设置
  5. PHP中的else怎么用,php中ifelse与elseif使用区别实例介绍
  6. 0311互联网新闻 | 知乎增加“视频回答”入口;苹果将最早于今年年底生产AR设备...
  7. Windows 7里的计算器,中文版,给Vista和2008用吧
  8. 第一章第一节:C++简介与学习方法
  9. html绘制静态图表,怎样用JavaScript和HTML5 Canvas绘制图表
  10. 深入剖析SolrCloud(四)
  11. POJ 3624 Charm Bracelet【01背包】
  12. 编码基本功:给刚刚学习编程的朋友的建议
  13. 【Fortran】CUDA+PGI Fortran安装教程
  14. 机械专业向机器人工程专业转型的可行性与前景分析
  15. mysql生成随机姓名、手机号、日期
  16. debian6安装nvidia GT620显卡 驱动
  17. 威联通使用 HP 1020 Plus 打印机
  18. Python——单线程与多线程
  19. c语言推箱子游戏实习报告,用C语言编写推箱子游戏
  20. ae手机版特效软件如何制作抖音热门视频飞天特效的教程

热门文章

  1. 救援模式下解决boot.local修改后无法登陆系统
  2. 十八种方法让你集中精力工作
  3. 前端教程丨手把手教你用 Next.js 搭建个人博客,从入门到吃鸡
  4. 中继误码率 matlab,关于误码率的问题 急!!!!!
  5. mysql xtrabackup-v2_pxc wsrep_sst_method均配置为xtrabackup-v2报错
  6. 如何限制用户的内存使用量
  7. war包部署-打包测试
  8. ConcurrentHashMap的初步使用及场景
  9. HTTPS证书的申请过程
  10. SSM综合练习表结构介绍