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>
例程显示效果图
附完整的源码下载连接,希望大家多多指教
期待下个版本能支持更多文件格式导出和指定导出数量
https://files.cnblogs.com/freeness/exp.rar