本参考以下链接,特此感谢
zKettle实战100篇 第19篇 转换核心对象Microsoft Excel输出组件 — 八一菜刀
kettle遍历目录_yzp950311的博客-CSDN博客
【Kettle】—— Kettle遍历执行SQL文件 - 灰信网(软件开发博客聚合)
【Kettle】—— Kettle遍历执行SQL文件_maixiaochai的博客-CSDN博客_kettle导入sql文件
Kettle之批量读取excel文件内容实现批量下载功能 - 灰信网(软件开发博客聚合)
总体逻辑大概如下
总流程
JS-初始化EXCEL名称和路径列表:
var prevRows=previous_result.getRows();
//如果结果集数据为null或者没有数据,直接返回false
if(prevRows == null &&(prevRows.size()==0)){
false;
}else{
for(var j = 0; j < prevRows.size(); j++){
//将所有结果集数据存进sourceUrl变量
parent_job.setVariable("prevRows"+j,prevRows.get(j));
}
//将元素个数设置给size变量
parent_job.setVariable("size",prevRows.size());
//设置一个循环起始变量
parent_job.setVariable("i",0);
true;
}
这里为什么 set变量的时候 ,是用for循环把每一条文件的内容加下标存进去
因为: 我之前试过用二维数组存 “文件路径+文件短名”的 方式,大概是下面这个样子
[[a1,a2],[b1,b2],[c1,c2]]
这个玩意存到 kettle的 变量里面 就是一个字符串 “[[a1,a2],[b1,b2],[c1,c2]] ”
我取出来之后,没法还原成 二维数组,只能把 [] 全部替换成空串,然后用逗号,split成数组,但是兄弟们,这样分割出来的数组就变成了1维数组了,等于你得到的是 [a1,a2,b1,b2,c1,c2]
但是你想要的是 [a1,a2],[b1,b2],[c1,c2] ,我试了 eval 去还原二维数组。没用,这个kettle里面的js不认识
所以 综上所述,我把每一条记录都用一个变量存起来了 区分它们的就是下标,比较笨,兄弟们有更好的方法请给我留言谢谢!
JS-读取单个excel的路径和文件名
var size=new Number(parent_job.getVariable("size"));
var i=new Number(parent_job.getVariable("i"));
//var prevRows=parent_job.getVariable("prevRows").replace("[","").replace("]","").split(",");
if(i>=size){
false;
}else{
//因为上一步添加进去的时候,是作为一个像数组元素一样的对象添加进去,变量都会转成字符串,所以直接移除掉就可以了
var subject="自定义日志输出";
//实例化日志channel对象
var log= new org.pentaho.di.core.logging.LogChannel(subject);
//日志输出
log.logMinimal("XXXXXXXXXXXXXXXXXXXXXXXX:");
//log.logMinimal(i);
var curRows=parent_job.getVariable("prevRows"+i).replace("[","").replace("]","").split(",");
parent_job.setVariable("furi",curRows[0]);
var fname = curRows[1];
var idxname = fname.indexOf(".");
var fsname = fname.substring(0,idxname)
parent_job.setVariable("fname",fname);
parent_job.setVariable("fsname",fsname);
true;
}
PS :这里设置的变量 furi和fsname 是为了在下一个转换里面当成参数传递给 “excel输入” 以及“excel输出”
furi : fileuri 文件的绝对路径
fsname : file short name 不带后缀的文件名
更新遍历的下标
//变量i自加
var i = new Number(parent_job.getVariable("i"))+1;
//在把i设置回去
parent_job.setVariable("i",i);
true;
(转换)读取excel文件列表:
获取文件名:获取这个目录下的所有你要的excel
字段选择-复制到结果: 把读取到的结果组装成结果集,供下一步读取遍历
(转换)清洗并输出新excel