zoukankan      html  css  js  c++  java
  • 【Kettle】Java借助Kettle将Excel导入数据

    示例功能(仅供测试): 
    在JAVA项目中,将数据从Excel文件导入数据库中。实现该能有多种方法,而本例则是“不走寻常路”,尝试借助Kettle实现数据导入。 
    原理: 
    Java中调用存储在Kettle资源库的Trans(转换),在Trans中将实现数据的验证、转码、导入,并导出错误数据的Excel 
    环境: 
    MyEclipse 8.5 + Kettle 4.4 + Oracle/MySQL 

    JAVA代码示例:

    需要用到的jar包:
    kettle-core.jar
    kettle-db.jar
    kettle-dbdialog.jar
    kettle-engine.jar
    kettle-test.jar
    kettle-ui-swt.jar
    kettle-vfs-20100924.jar
    log4j-1.2.17.jar
    Oracle_10g_10.2.0.4_JDBC_ojdbc14.jar
    commons-logging-1.1.3.jar
    jxl.jar
    commons-lang-2.6.jar
    package com.kettle;
    
    import org.pentaho.di.core.KettleEnvironment;
    import org.pentaho.di.core.database.DatabaseMeta;
    import org.pentaho.di.core.exception.KettleException;
    import org.pentaho.di.core.util.EnvUtil;
    import org.pentaho.di.repository.RepositoryDirectoryInterface;
    import org.pentaho.di.repository.kdr.KettleDatabaseRepository;
    import org.pentaho.di.repository.kdr.KettleDatabaseRepositoryMeta;
    import org.pentaho.di.trans.Trans;
    import org.pentaho.di.trans.TransMeta;
    
    public class ExecTrans {
        private static String repName = "KETTLE_4";
        private static String dbType = "Oracle";
        private static String dbAccess = "Native";
        private static String dbHost = "192.168.200.66";
        private static String dbName = "KYY";
        private static String dbPort = "1521";
        private static String dbUser = "KETTLE_4";
        private static String dbPass = "a1b2c3";
    
        /**
         * JAVA 调用 Kettle,执行Trans
         * 
         * @param args
         * @throws KettleException
         */
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            // 配置转换名称
            String transName = "Test_imp_emp";
            // 配置Excel的文件路径及名称
            String fileName = "E:\template\export\成绩导入模板1203.xls";
            // 配置错误Excel的文件路径及名称
            String errorFileName = "E:\template\export\error_成绩导入";
            // 配置数据库连接
            execTransForDB(transName, fileName, errorFileName);
    
        }
    
        /**
         * 配置数据源 调用资源库中的相关job 、transfer
         */
        public static void execTransForDB(String transName, String fileName, String errorFileName) {
    
            try {
                KettleEnvironment.init();
                // 创建DB资源库
                KettleDatabaseRepository repository = new KettleDatabaseRepository();
                DatabaseMeta databaseMeta = new DatabaseMeta(repName, dbType,
                        dbAccess, dbHost, dbName, dbPort, dbUser, dbPass);
                // 选择资源库
                KettleDatabaseRepositoryMeta kettleDatabaseRepositoryMeta = new KettleDatabaseRepositoryMeta(
                        "Kettle", "Kettle", "Transformation description",
                        databaseMeta);
                repository.init(kettleDatabaseRepositoryMeta);
                // 连接资源库
                repository.connect("admin", "admin");
                RepositoryDirectoryInterface directoryInterface = repository
                        .loadRepositoryDirectoryTree();
                // 选择转换
                TransMeta transMeta = repository.loadTransformation(transName,
                        directoryInterface, null, true, null);
                Trans trans = new Trans(transMeta);
                trans.setVariable("fileName", fileName);
                trans.setVariable("errorFileName", errorFileName);
                trans.execute(null);
                trans.waitUntilFinished();// 等待直到数据结束
                if (trans.getErrors() > 0) {
                    System.out.println("transformation error");
                } else {
                    System.out.println("transformation successfully");
                }
            } catch (KettleException e) {
                e.printStackTrace();
            }
        }
    }

    Kettle 转换示例:

    流程说明:
    1、生成记录(从Java中传入参数获取文件名);
    2、File exists(判断文件是否存在);
    3、过滤记录(过滤掉文件不存在的情况);
    4、Excel输入(根据Java中传入文件名参数,读取Excel文件)
    5、字段选择(将Excel中列头转为数据库中的字段名)
    6、流查询(与数据库中数据比对,选择规范的数据)
    7、过滤记录2(将规范数据和不规范数据分发至8、插入/更新 和 9、Excel Output)
    8、插入/更新(将规范数据持久化在数据库中)
    9、Excel Output(将错误数据导出为新的Excel文件)

    示例分析:

    优点:1、读取Excel交给Kettle处理;2、分析数据、验证数据、转换格式由Kettle处理;3、可以方便地导出错误数据以供用户修改;4、可以灵活、方便地处理数据,不用在Java里for...if...else...去操作。

    缺点:1、Excel列名不能动态传参,需要提前配置好;2、对于整个数据流的监控欠缺,还需完善

    总结,利用Kettle对各种数据库的灵活支持,可以很方便地将此功能用在系统第一次上线需要导入大批量数据。同样可以用在,需要大量导出Execl文件的功能。

  • 相关阅读:
    狄慧201771010104《面向对象程序设计(java)》第十六周学习总结
    狄慧201771010104《面向对象程序设计(java)》第十五周学习总结
    狄慧201771010104《面向对象程序设计(java)》第十四周学习总结
    201771030122-王瑞梅 实验二 个人项目—《西北师范大学学生疫情上报系统》项目报告
    201771030122-王瑞梅 实验一 软件工程准备—<初读《构建之法--现代软件工程》>
    软件工程学习总结
    团队项目在GitHub合作开发管理流程
    2020 软件工程—— 中期获“衣”有感
    201771010131-王之泰 实验四 软件项目案例分析
    数据库连接和导出excal
  • 原文地址:https://www.cnblogs.com/leemoby/p/3467862.html
Copyright © 2011-2022 走看看