示例功能(仅供测试): 
在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文件的功能。

【Kettle】Java借助Kettle将Excel导入数据的更多相关文章

  1. Excel导入数据到Sql server 中出错:“文本被截断,或者一个或多个字符在目标代码页中没有匹配项”

    从Excel导入数据到Sql server 时,由于表中的数据有的很长,导入时出现如下错误(如果数据不是很长,255内以内,则不会出现错误): 出错原因: SQL Server的导入导出为了确定数据表 ...

  2. 实现excel导入导出功能,excel导入数据到页面中,页面数据导出生成excel文件

    今天接到项目中的一个功能,要实现excel的导入,导出功能.这个看起来思路比较清楚,但是做起了就遇到了不少问题. 不过核心的问题,大家也不会遇到了.每个项目前台页面,以及数据填充方式都不一样,不过大多 ...

  3. Java 使用 Jxl 实现 Excel 导入导出

    开发过程中经常需要用到数据的导入导出功能,之前用的是POI,这次使用JXL,JXL相对于POI来说要轻量简洁许多,在数据量不大的情况下还是非常实用的.这里做一下使用JXL的学习记录.首先需要导入相应的 ...

  4. java利用jxl实现Excel导入功能

    本次项目实践基于Spring+SpringMvc+MyBatis框架,简单实现了Excel模板导出.和Excel批量导入的功能.实现过程如下:. 1.maven导入所需jar包 <depende ...

  5. Java之POI的excel导入导出

    一.Apache POI是一种流行的API,它允许程序员使用Java程序创建,修改和显示MS Office文件.这由Apache软件基金会开发使用Java分布式设计或修改Microsoft Offic ...

  6. 记录-java(jxl) Excel导入数据库

    本内容主要包括(文件上传.excel2003数据导入数据库)excel导入数据库功能需要jxl  jar包支持 下面是文件上传的前端测试代码 <%@ page language="ja ...

  7. jxl java工具类,导出excel,导入数据库

    1: 引入jxl jar 我使用的为maven管理, <!--Excel工具--> <dependency> <groupId>net.sourceforge.je ...

  8. C#实现Excel模板导出和从Excel导入数据

    午休时间写了一个Demo关于Excel导入导出的简单练习 1.窗体 2.引用office命名空间 添加引用-程序集-扩展-Microsoft.Office.Interop.Excel 3.封装的Exc ...

  9. 项目经验之:再来一章:excel导入数据 封装成最棒的不容易!!!

    我见过很的系统,包括OA,ERP,CRM等,在常用的功能当中,从外部导入数据是最常用到的.因为很多客户需要以excel的形式提供数据,,这样的方式我们又如何做呢, 大家最常见的做法可能是这样的,在需要 ...

随机推荐

  1. 【剑指offer】数组中出现次数超过数组长度一半的数字,C++实现

    原创博文,转载请注明出处! # 题目 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过 ...

  2. [转]MongoDB c++驱动安装与使用

    安装 获取源码:git clone https://github.com/mongodb/mongo-cxx-driver.git,解压 安装编译工具scons:yum install -y scon ...

  3. windows中的oracle12SE后启动的系统服务的列表

    下图是我安装在windows 10下安装好oracle12.10SE之后的启动的系统服务的列表. 通常,我是将其全部修改为手动启动.当需要用oracle服务的时候,只需要启动对应的实例的服务和tnsl ...

  4. WebLogic11g-常用运维操作

    转:http://www.codeweblog.com/weblogic11g-%e5%b8%b8%e7%94%a8%e8%bf%90%e7%bb%b4%e6%93%8d%e4%bd%9c/ 希望这篇 ...

  5. C语言控制台窗体图形界面编程(八):鼠标事件

           上次讲的是键盘事件,这次我们介绍鼠标事件. 以下先介绍下鼠标事件的结构体以及相关信息. typedef struct _MOUSE_EVENT_RECORD //鼠标事件结构体 { CO ...

  6. jdk、jre、JVM的简单区别与联系

    2015-10-20 23:08:52 (1)jdk Java development toolkit(开发工具包),JDK是整个JAVA的核心,包括了Java运行环境jre(Java Runtime ...

  7. c++重在运算符前置自增和后置自增

    class student { int age; }; int main() { class student stu; (stu++)++;//error ++(stu++);//error stu+ ...

  8. http请求发生了两次(options请求)

    前言 自后台restful接口流行开来,请求了两次的情况(options请求)越来越普遍.笔者也在实际的项目中遇到过这种情况,做一下整理总结. 文章书写思路: 为什么发生两次请求 http的请求方式, ...

  9. PyBrain库的example之NFQ流程图分析

    PyBrain库的example之NFQ流程图分析 如下是测试程序.主要分析doEpisode和learn两个函数. #!/usr/bin/env python __author__ = 'Thoma ...

  10. Spring RESTful之@ModelAttribute

    @ModelAttribute有俩个位置,一个是在方法体中,下面这个demo的用意就是每次controller@RequestMapping方法被调用之前都会走这个方法,并向Model中(@Reque ...