Kettle实现从数据库中提取数据到Excel
因为有个日常提数,工作日每天都要从数据库中提取数据,转换为excel,再以邮件的形式发给用户。
刚好近期同事在研究使用kettle自动提数且完成邮件的发送,觉得很实用又挺有意思的就学了一下这个技能~
首先我们需要新建 转换
转换: 可以将数据从数据库中提取到excel中
然后我们如果想要定时提取数据的话,可以新建 作业
作业: 可以定时执行转换任务,然后还可以将发送邮件耶~ (不过这个技能我还不是很熟悉,等我熟悉了再更新嘻嘻)
一 、 新建转换
1.点击 + 号 ,也就是新建 ,然后选择 转换

2. 从 核心对象 视图切换为 主对象树 , 然后开始建立我们的数据库连接
双击 DB连接,会出现下图标记的 3 弹窗
填写数据库连接信息,我这里选择连接oracle数据库,必要填写的信息为红色标记框所标记的 数据库ip 数据库名 端口号 用户名 密码

3.数据库信息填写完后我们可以点击测试按钮,看看是否能正常连接(提示为 正确连接到数据库【test】,表示信息填写没有问题)

4. 切换视图: 主对象树 切换到 核心对象,我们开始设立我们的输入与输出

5. 输入 : 我们 从输入的子菜单中选择 表输入
双击 表输入,会在右侧出现 表输入图标
双击右侧表输入图标,再次出现 下图标记4出现的弹窗

6. 在弹窗中,我们开始定义输入相关信息啦
关于sql语句,我们还有一点需要注意,就是日期形式的数据需要定义一下,不然导出的数据就会数值类型啦(49165..类似的)
oracle: to_char('2019-05-05','yyyy-MM-dd')
mysql: DATE_FORMAT('2019-05-05',''%Y-%m-%d')

7. 输入定义好后,我们开始定义输出啦。 这里我们选择以excel的形式输出数据
选择核心对象下的 输出,双击输出下的子菜单 Microsoft Excel输出 ,会出现右侧的输出图标
双击右侧的输出图标,出现右侧 5标记的弹窗信息

8.定义详细的输出
选定输出文件的位置,如果不写绝对路径则会输出在 kettle启动文件 Sqoon.bat的统计目录下
下面记得选中Excel 2007 and above
最后点击确定

9.点击执行按钮,然后就根据提示选择 保存

10. 执行转换

11.执行成功后,我们回到桌面就会看到刚刚保存的文件啦~

二、新建 作业
1.点击 + 号,然后选择 作业

2.选择通用, START (双击,出现右侧开始图标)

3.在 START里面定义 怎么执行(我这里定义为每天9点执行)

4.双击通用下的 转换

5.配置转换相关信息
选中我们刚刚配置好的转换信息(保存位置看你自己之前保存在哪里哦,我是放在了桌面~) ,最后选择确定即可

6.点击执行,会要求我们先保存此次编辑的 作业信息 ,如下图

7. 保存好后,我们可以再次启动,运行啦~ (其实还可以导入文件 test.kjb)

最后提供一个发送邮件的 testzip.kjb 示例 (可直接使用kettle打开,更改邮件服务配置信息即可运行)
<?xml version="1.0" encoding="UTF-8"?>
<job>
<name>testzip</name>
<description />
<extended_description />
<job_version />
<directory>/</directory>
<created_user>-</created_user>
<created_date>2019/06/17 11:35:43.098</created_date>
<modified_user>-</modified_user>
<modified_date>2019/06/17 11:35:43.098</modified_date>
<parameters>
</parameters>
<slaveservers>
</slaveservers>
<job-log-table>
<connection />
<schema />
<table />
<size_limit_lines />
<interval />
<timeout_days />
<field>
<id>ID_JOB</id>
<enabled>Y</enabled>
<name>ID_JOB</name>
</field>
<field>
<id>CHANNEL_ID</id>
<enabled>Y</enabled>
<name>CHANNEL_ID</name>
</field>
<field>
<id>JOBNAME</id>
<enabled>Y</enabled>
<name>JOBNAME</name>
</field>
<field>
<id>STATUS</id>
<enabled>Y</enabled>
<name>STATUS</name>
</field>
<field>
<id>LINES_READ</id>
<enabled>Y</enabled>
<name>LINES_READ</name>
</field>
<field>
<id>LINES_WRITTEN</id>
<enabled>Y</enabled>
<name>LINES_WRITTEN</name>
</field>
<field>
<id>LINES_UPDATED</id>
<enabled>Y</enabled>
<name>LINES_UPDATED</name>
</field>
<field>
<id>LINES_INPUT</id>
<enabled>Y</enabled>
<name>LINES_INPUT</name>
</field>
<field>
<id>LINES_OUTPUT</id>
<enabled>Y</enabled>
<name>LINES_OUTPUT</name>
</field>
<field>
<id>LINES_REJECTED</id>
<enabled>Y</enabled>
<name>LINES_REJECTED</name>
</field>
<field>
<id>ERRORS</id>
<enabled>Y</enabled>
<name>ERRORS</name>
</field>
<field>
<id>STARTDATE</id>
<enabled>Y</enabled>
<name>STARTDATE</name>
</field>
<field>
<id>ENDDATE</id>
<enabled>Y</enabled>
<name>ENDDATE</name>
</field>
<field>
<id>LOGDATE</id>
<enabled>Y</enabled>
<name>LOGDATE</name>
</field>
<field>
<id>DEPDATE</id>
<enabled>Y</enabled>
<name>DEPDATE</name>
</field>
<field>
<id>REPLAYDATE</id>
<enabled>Y</enabled>
<name>REPLAYDATE</name>
</field>
<field>
<id>LOG_FIELD</id>
<enabled>Y</enabled>
<name>LOG_FIELD</name>
</field>
<field>
<id>EXECUTING_SERVER</id>
<enabled>N</enabled>
<name>EXECUTING_SERVER</name>
</field>
<field>
<id>EXECUTING_USER</id>
<enabled>N</enabled>
<name>EXECUTING_USER</name>
</field>
<field>
<id>START_JOB_ENTRY</id>
<enabled>N</enabled>
<name>START_JOB_ENTRY</name>
</field>
<field>
<id>CLIENT</id>
<enabled>N</enabled>
<name>CLIENT</name>
</field>
</job-log-table>
<jobentry-log-table>
<connection />
<schema />
<table />
<timeout_days />
<field>
<id>ID_BATCH</id>
<enabled>Y</enabled>
<name>ID_BATCH</name>
</field>
<field>
<id>CHANNEL_ID</id>
<enabled>Y</enabled>
<name>CHANNEL_ID</name>
</field>
<field>
<id>LOG_DATE</id>
<enabled>Y</enabled>
<name>LOG_DATE</name>
</field>
<field>
<id>JOBNAME</id>
<enabled>Y</enabled>
<name>TRANSNAME</name>
</field>
<field>
<id>JOBENTRYNAME</id>
<enabled>Y</enabled>
<name>STEPNAME</name>
</field>
<field>
<id>LINES_READ</id>
<enabled>Y</enabled>
<name>LINES_READ</name>
</field>
<field>
<id>LINES_WRITTEN</id>
<enabled>Y</enabled>
<name>LINES_WRITTEN</name>
</field>
<field>
<id>LINES_UPDATED</id>
<enabled>Y</enabled>
<name>LINES_UPDATED</name>
</field>
<field>
<id>LINES_INPUT</id>
<enabled>Y</enabled>
<name>LINES_INPUT</name>
</field>
<field>
<id>LINES_OUTPUT</id>
<enabled>Y</enabled>
<name>LINES_OUTPUT</name>
</field>
<field>
<id>LINES_REJECTED</id>
<enabled>Y</enabled>
<name>LINES_REJECTED</name>
</field>
<field>
<id>ERRORS</id>
<enabled>Y</enabled>
<name>ERRORS</name>
</field>
<field>
<id>RESULT</id>
<enabled>Y</enabled>
<name>RESULT</name>
</field>
<field>
<id>NR_RESULT_ROWS</id>
<enabled>Y</enabled>
<name>NR_RESULT_ROWS</name>
</field>
<field>
<id>NR_RESULT_FILES</id>
<enabled>Y</enabled>
<name>NR_RESULT_FILES</name>
</field>
<field>
<id>LOG_FIELD</id>
<enabled>N</enabled>
<name>LOG_FIELD</name>
</field>
<field>
<id>COPY_NR</id>
<enabled>N</enabled>
<name>COPY_NR</name>
</field>
</jobentry-log-table>
<channel-log-table>
<connection />
<schema />
<table />
<timeout_days />
<field>
<id>ID_BATCH</id>
<enabled>Y</enabled>
<name>ID_BATCH</name>
</field>
<field>
<id>CHANNEL_ID</id>
<enabled>Y</enabled>
<name>CHANNEL_ID</name>
</field>
<field>
<id>LOG_DATE</id>
<enabled>Y</enabled>
<name>LOG_DATE</name>
</field>
<field>
<id>LOGGING_OBJECT_TYPE</id>
<enabled>Y</enabled>
<name>LOGGING_OBJECT_TYPE</name>
</field>
<field>
<id>OBJECT_NAME</id>
<enabled>Y</enabled>
<name>OBJECT_NAME</name>
</field>
<field>
<id>OBJECT_COPY</id>
<enabled>Y</enabled>
<name>OBJECT_COPY</name>
</field>
<field>
<id>REPOSITORY_DIRECTORY</id>
<enabled>Y</enabled>
<name>REPOSITORY_DIRECTORY</name>
</field>
<field>
<id>FILENAME</id>
<enabled>Y</enabled>
<name>FILENAME</name>
</field>
<field>
<id>OBJECT_ID</id>
<enabled>Y</enabled>
<name>OBJECT_ID</name>
</field>
<field>
<id>OBJECT_REVISION</id>
<enabled>Y</enabled>
<name>OBJECT_REVISION</name>
</field>
<field>
<id>PARENT_CHANNEL_ID</id>
<enabled>Y</enabled>
<name>PARENT_CHANNEL_ID</name>
</field>
<field>
<id>ROOT_CHANNEL_ID</id>
<enabled>Y</enabled>
<name>ROOT_CHANNEL_ID</name>
</field>
</channel-log-table>
<pass_batchid>N</pass_batchid>
<shared_objects_file />
<entries>
<entry>
<name>Zip 压缩文件</name>
<description />
<type>ZIP_FILE</type>
<zipfilename>C:\Users\S0111\Desktop\最新运营中心KPI20190615.zip</zipfilename>
<compressionrate>1</compressionrate>
<ifzipfileexists>0</ifzipfileexists>
<wildcard />
<wildcardexclude />
<sourcedirectory>D:\DEV_TOOLS\kettle\pdi-ce-7.1.0.0-12\data-integration\网上保单贷款2019-06-18.xlsx</sourcedirectory>
<movetodirectory />
<afterzip>0</afterzip>
<addfiletoresult>Y</addfiletoresult>
<isfromprevious>N</isfromprevious>
<createparentfolder>Y</createparentfolder>
<adddate>N</adddate>
<addtime>N</addtime>
<SpecifyFormat>N</SpecifyFormat>
<date_time_format>yyyy/MM/dd HH:mm:ss</date_time_format>
<createMoveToDirectory>N</createMoveToDirectory>
<include_subfolders>N</include_subfolders>
<stored_source_path_depth>1</stored_source_path_depth>
<parallel>N</parallel>
<draw>Y</draw>
<nr>0</nr>
<xloc>368</xloc>
<yloc>160</yloc>
</entry>
<entry>
<name>START</name>
<description />
<type>SPECIAL</type>
<start>Y</start>
<dummy>N</dummy>
<repeat>N</repeat>
<schedulerType>0</schedulerType>
<intervalSeconds>0</intervalSeconds>
<intervalMinutes>60</intervalMinutes>
<hour>12</hour>
<minutes>0</minutes>
<weekDay>1</weekDay>
<DayOfMonth>1</DayOfMonth>
<parallel>N</parallel>
<draw>Y</draw>
<nr>0</nr>
<xloc>192</xloc>
<yloc>176</yloc>
</entry>
<entry>
<name>添加文件到结果文件中</name>
<description />
<type>ADD_RESULT_FILENAMES</type>
<arg_from_previous>Y</arg_from_previous>
<include_subfolders>N</include_subfolders>
<delete_all_before>N</delete_all_before>
<fields>
<field>
<name>C:\Users\Administrator\Desktop\报表平台\kettle每周提数</name>
<filemask>*.zip</filemask>
</field>
</fields>
<parallel>N</parallel>
<draw>Y</draw>
<nr>0</nr>
<xloc>528</xloc>
<yloc>176</yloc>
</entry>
<entry>
<name>发送邮件</name>
<description />
<type>MAIL</type>
<server>11.22.33.44</server>
<port>25</port>
<destination>duanfeixia@chinalife.com.hk</destination>
<destinationCc />
<destinationBCc />
<replyto>xubo@chinalife.com.hk</replyto>
<replytoname />
<subject>嗯嗯嗯嗯</subject>
<include_date>N</include_date>
<contact_person />
<contact_phone />
<comment>test mail</comment>
<include_files>Y</include_files>
<zip_files>N</zip_files>
<zip_name />
<use_auth>N</use_auth>
<use_secure_auth>N</use_secure_auth>
<auth_user />
<auth_password>Encrypted </auth_password>
<only_comment>Y</only_comment>
<use_HTML>N</use_HTML>
<use_Priority>N</use_Priority>
<encoding>UTF-8</encoding>
<priority>normal</priority>
<importance>normal</importance>
<sensitivity>normal</sensitivity>
<secureconnectiontype>SSL</secureconnectiontype>
<replyToAddresses />
<filetypes>
<filetype>GENERAL</filetype>
</filetypes>
<embeddedimages>
</embeddedimages>
<parallel>N</parallel>
<draw>Y</draw>
<nr>0</nr>
<xloc>672</xloc>
<yloc>176</yloc>
</entry>
</entries>
<hops>
<hop>
<from>START</from>
<to>Zip 压缩文件</to>
<from_nr>0</from_nr>
<to_nr>0</to_nr>
<enabled>Y</enabled>
<evaluation>Y</evaluation>
<unconditional>Y</unconditional>
</hop>
<hop>
<from>添加文件到结果文件中</from>
<to>发送邮件</to>
<from_nr>0</from_nr>
<to_nr>0</to_nr>
<enabled>Y</enabled>
<evaluation>Y</evaluation>
<unconditional>N</unconditional>
</hop>
<hop>
<from>Zip 压缩文件</from>
<to>添加文件到结果文件中</to>
<from_nr>0</from_nr>
<to_nr>0</to_nr>
<enabled>Y</enabled>
<evaluation>Y</evaluation>
<unconditional>N</unconditional>
</hop>
</hops>
<notepads>
</notepads>
</job>
ps: 详细示例请从github中下载源码信息~ (打开查看详情,需要本机已安装kettle)
github地址: https://github.com/DFX339/kettle_operate
Kettle实现从数据库中提取数据到Excel的更多相关文章
- 将Oracle数据库中的数据写入Excel
将Oracle数据库中的数据写入Excel 1.准备工作 Oracle数据库"TBYZB_FIELD_PRESSURE"表中数据如图: Excel模板(201512.xls): 2 ...
- python制作简单excel统计报表3之将mysql数据库中的数据导入excel模板并生成统计图
python制作简单excel统计报表3之将mysql数据库中的数据导入excel模板并生成统计图 # coding=utf-8 from openpyxl import load_workbook ...
- NPOI从数据库中导出数据到Excel
首先要添加NPOI.dll程序集 https://yunpan.cn/cMeSTELJSXmJJ 访问密码 8d83 把里面的程序集都添加到引用里 下面的代码是从数据库导出到Excel { //pa ...
- python从sqlite中提取数据到excel
import sqlite3 as sqlite from xlwt import * import sys def sqlite_get_col_names(cur, select_sql): cu ...
- 用java语言将数据库中的数据表转换为xml文件的通用程序(细化)
转自:https://www.cnblogs.com/wudage/p/7650685.html 总是在网络上copy别人的源代码,今天我也贴出自己今天写的源码,相信这个程序会对大家在平时的工作中需要 ...
- SQLServer---------使用Excel 往sqlServer数据库中导入数据
1.右击创建好的表选择编辑200行 2.保证Excel的字段顺序与数据中顺序一致 3.选中好了后进行复制 4.打开文本 一个快捷方式 将excel 中的数据 黏贴放到文本中 5.点击sql ...
- 知识共享图文直播---(一)将数据库中的数据加载到MSFlexGrid空间中再导入Excel
熟话说万物皆有其存在的道理,为什么我突然想写<知识共享图文直播>这个系列呢?首先,我想的是记录自己学习的历程,在记录中加深自己对知识的理解,同时也希望自己的博文能帮助到其他数据库的初学者. ...
- 转: SQL中的where条件,在数据库中提取与应用浅析
SQL中的where条件,在数据库中提取与应用浅析 http://hedengcheng.com/?p=577 1问题描述 一条SQL,在数据库中是如何执行的呢?相信很多人都会对这个问题比较感兴趣.当 ...
- php从mysql数据库中取数据
php从数据库中取数据 面向过程 <?php $server_name="localhost:3306"; //数据库服务器名称 $username="root& ...
随机推荐
- CODING 受邀参与 DevOps 标准体系之系统和工具&技术运营标准技术专家研讨会
2019 年 5 月 24-25 日,国内领先的一站式 DevOps 解决方案供应商 CODING 作为腾讯云的深度合作伙伴,受邀参加在成都举行的由 TC608 云计算标准和开源推进委员会主办,中国信 ...
- [20191220]关于共享内存段相关问题.txt
[20191220]关于共享内存段相关问题.txt --//我一直很好奇如果设置内核参数kernel.shmmax = 68719476736足够大,为什么我的测试实例还是建立3个共享内存段.--// ...
- enable SSL on weblogic
To provision (install) a certificate on the server On the Start menu, click Run, and in the Open box ...
- 《Web Development with Go》Middleware之使用codegangsta.negroni
这个第三方库,使用自定义中间件时, 语法就感觉流畅很多. package main import ( "fmt" "log" "net/http&qu ...
- 10. 函数-lambda函数及高阶函数
一.匿名函数解析 关键字lambda表示匿名函数,冒号前面的n表示函数参数,可以有多个参数.匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果. 用匿名函数有 ...
- if(response.isSuccess){}else{}的方式,如果我们由于忽略没有设置success字段的值,就可能导致
在日常开发中,我们会经常要在类中定义布尔类型的变量,比如在给外部系统提供一个RPC接口的时候,我们一般会定义一个字段表示本次请求是否成功的. 关于这个”本次请求是否成功”的字段的定义,其实是有很多种讲 ...
- Docker 零碎
Delete none tag docker image: $ docker stop $(docker ps -a | grep "Exited" | awk '{print $ ...
- mysql给字段取别名无法被jdbc解析的解决办法
项目上用的Spring JDBC,是通过ResultSetMetaData接口来调用具体数据库的JDBC实现类来获取数据库返回结果集的. 在项目开发中,发现在MySQL中使用的别名没有办法被正常解析, ...
- 【AGC035F】Two Histograms
Problem Description 你有一个 \(N\) 行.\(M\) 列的.每个格子都填写着 0 的表格.你进行了下面的操作: 对于每一行 \(i\) ,选定自然数 \(r_i\) (\(0\ ...
- C#中类的修饰符
Q&A 项目=程序集=assembly 1,Q:类的修饰符有哪些? A: 有 new.public.protect.internal.private.abstract.sealed.st ...