exp4me 用java做的实用的csv导出程序 - 名传无线.freeness.yang
支持格式: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相关推荐
- 如何复制java卡,使用java做一个简单的集卡程序
使用java做一个简单的集卡程序 本次设想的是要集齐4张卡,每张卡的概率都是25%,如果每个用户集齐需要多少次才能集合完毕 public class Test { public static void ...
- java做 excel文件的 导入导出 (SSM+layer)
做的项目使用时 Java ssm + 前端layer+ freemark. 因为是从项目中扣的代码.整理了下逻辑. 有问题的下方留言哈 导入的依赖 poi <!-- https://mvnrep ...
- 怎么用java做随机选人软件_Java小程序:五人随机选一人并显示姓名
该程序实现的是用空格键控制五个人编号的滚动(用Timer实现),当选定一个人的时候,显示其名字,具体界面如下: 此程序需要链接数据库,在此用的是Access数据库,数据链接的代码如下: import ...
- java求面积_用Java做个计算长方形面积的程序(3)
11.这是计算长方形的源代码可以直接在进行编译运行,希望大家从中能够获益良多. //载入Scanner类文件. //java.util.Scanner 是 Java5 的新特征,我们可以通过 Scan ...
- java实现通话_Java做一个最简单的通话程序
Java做一个最简单的通话程序 作者:未知 文章来源:www.jspcn.net 发布日期:2005年01月19日 Java中的网络编程是一个很重要的部分,也是其编程优越性的地方之一.在Java ...
- 51单片机可以做什么实用的产品?
我用51的单片机做过不少于10款产品了. 我看到很多文章,说51已经过时了,新手没必要学习51单片机,可以直接学STM32. 我个人认为这种说法存在一定的误导,51还是有很大的市场. 很多人想从事嵌入 ...
- java做jsp问题_java/jsp中 中文问题详解
java/jsp中 中文问题详解 更新时间:2006年10月13日 00:00:00 作者: 预备知识: 1.字节和unicode Java内核是unicode的,就连class文件也是,但是很多 ...
- Java导出excel中poi的导出和csv导出excel
最近在做一个文史类统计项目,许多地方需要用到导出excel报表.之前用的是公司的poi导出,最后听群友说csv的导出会比poi快很多.但是csv文件是以","分割文件的.如果数据中 ...
- java sslsocket程序_JAVA与C++进行sslsocket通信,JAVA做服务端或客户端
前几天有位网友问我关于Unity3D里面使用Protobuf的方法,一时有事拖到现在才写这篇文章,不好意思哈. 本文测试环境: 系统:WINDOWS 7(第3.6步).OS X 10.9(第4步) 软 ...
最新文章
- 正则显示手机号显示3 4 4 格式
- 2020 年,人工智能和深度学习未来的五大趋势
- 不同存储区域的数组分析
- 【实用/转载】ALV OO Container屏幕自适应设置
- PHP中的else怎么用,php中ifelse与elseif使用区别实例介绍
- 0311互联网新闻 | 知乎增加“视频回答”入口;苹果将最早于今年年底生产AR设备...
- Windows 7里的计算器,中文版,给Vista和2008用吧
- 第一章第一节:C++简介与学习方法
- html绘制静态图表,怎样用JavaScript和HTML5 Canvas绘制图表
- 深入剖析SolrCloud(四)
- POJ 3624 Charm Bracelet【01背包】
- 编码基本功:给刚刚学习编程的朋友的建议
- 【Fortran】CUDA+PGI Fortran安装教程
- 机械专业向机器人工程专业转型的可行性与前景分析
- mysql生成随机姓名、手机号、日期
- debian6安装nvidia GT620显卡 驱动
- 威联通使用 HP 1020 Plus 打印机
- Python——单线程与多线程
- c语言推箱子游戏实习报告,用C语言编写推箱子游戏
- ae手机版特效软件如何制作抖音热门视频飞天特效的教程