【Kettle】Java借助Kettle将Excel导入数据
2024-10-20 09:33:17
示例功能(仅供测试):
在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.jarpackage 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文件的功能。
最新文章
- 天津政府应急系统之GIS一张图(arcgis api for flex)讲解(三)显示地图坐标系模块
- spring的初始化bean,销毁bean之前的操作详解
- 九度OJ1077
- [terry笔记]Oracle会话追踪(二):TKPROF
- Jquery 弹出提示框输入插件 apprise 修改中文按钮以及使用说明
- [irving] C# Windows Beep 调用声音文件
- Java的native关键字---JAVA下调用其他语言的关键词
- mysql存储过程调试方法
- Appium介绍
- ZOJ3827 ACM-ICPC 2014 亚洲区域赛的比赛现场牡丹江I称号 Information Entropy 水的问题
- A New Change Problem
- .NET Core在WindowsServer服务器部署及发布
- nodejs 后台服务启动
- Swift 产生 uuid
- wriesharek同时监听多个端口
- Celery分布式任务队列快速入门
- 研究js特效巩固JavaScript知识
- c#实现动态加载Dll(转)
- 1064: 不明飞行物(ufo)
- linux mysql安装问题
热门文章
- python3.4 使用BeautifulSoup问题
- SQLServer OpenRowSet 导入数据
- HDU - 4336:Card Collector(min-max容斥求期望)
- Hive SQL的编译过程[转载自https://tech.meituan.com/hive-sql-to-mapreduce.html]
- SmartSql 动态仓储
- eclipse安装最新版svn
- ORACLE 12C RMAN 功能增强
- 排序 第K大等问题总结
- CentOS(五)--Linux系统的分区概念
- UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 7: ordinal not in range(128) [duplicate]