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

posted @ 2012-07-04 15:01  freeness  阅读(597)  评论(1编辑  收藏  举报