时间:2021-07-01 10:21:17 帮助过:89人阅读
示例学习kettle之ExcelWriter步骤 ExcelWriter步骤可以向excel模板文件中填写内容的一种方法,并且可以往同一文件的不同sheet中写内容。本文通过示例详细讲解,通过一个转换生成报表。 ExcelWriter步骤是kettle4.1以上版本才有,同时我们也使用Block until s
示例学习kettle之ExcelWriter步骤
ExcelWriter步骤可以向excel模板文件中填写内容的一种方法,并且可以往同一文件的不同sheet中写内容。本文通过示例详细讲解,通过一个转换生成报表。
ExcelWriter步骤是kettle4.1以上版本才有,同时我们也使用“Block until steps finish”步骤(kettle4.1版本有),如果你使用版本是3.2或4.0,就使用自定义javasc步骤代替。本文的示例代码在这里下载。
最终导出报表文件格式
示例报表文件主要内容是6个月的销售和费用信息,包含三个sheet: “Sales Chart”sheet 包含一个图表显示每个月每个类型的销售情况。
“SourceData“sheet是需要通过kettle填入的源数据,包括一些字段、一些计算值以及饼图。
“Metadata“sheet是报表本身的一些信息,生成日期,转换的名称,在那台主机上生成的。
模板文件
模板文件除了格式,输入之前没有数据,“SourceData“sheet需要填入相应的数据,其他的字段自动计算(已经有了公式)。
“Metadata“sheet也需要填入一些信息。
使用kettle往模板文件中填入数据
分析上面模板文件,需填入数据的入口点,共有四个方面需要插入数据。
1. “SourceData“sheet上的year单元格;
2. “SourceData“sheet上的销售信息数据;
3. “SourceData“sheet上的费用信息数据;
4. “Metadata“sheet的单元格;
因为有四个地方需要输出数据,所以需要在转换定义四个Excel Writer步骤。问题是kettle的转换时并行执行的,如果四个步骤同时写一个excel文件,则会产生错误。因此需要确保按顺序执行。我们可以通过定义四个转换,然后在job中顺序调用四个转换,因为job是顺序执行的,这样就觉得不是很方便。通常不相关的数据要被填入到同一个excel文件,最好能定义在一个转换中,便于维护。本文通过另外一种方式实现顺序执行,请看下图:
确保顺序执行
转换中写excel文件需四个流程步骤,按照如下顺序:year、销售、费用以及报表元信息单元格。Excel Writer步骤需要配置写到同一个文件,即从模板文件拷贝的文件。因此,第一步(year写入步骤)配置使用模板文件并创建新的输出文件。其他的excel写入步骤只需要配置输出文件(因为已经存在了),但同时也需要选中“wait for first row before creating file”选项(在接收到数据前不创建文件),这样是确保在接收到第一个数据后才查找输出文件。
如何做到延迟,在接收到第一行数据时,前面Excel写入步骤的所有操作都执行完毕,这里就需要“Block until steps finish”阻止步骤。year写入步骤是第一个执行,所以需要配置模板文件和创建输出文件,并写入year数据。销售写步骤等待year步骤完成,费用步骤等待销售步骤完成,元信息步骤等待费用步骤。结果就像一个精密的链式步骤,彼此等待,最终完成各自数据的写入。
如果你使用3.2或4.0版本,阻止步骤无效,查看附件中相应的版本,使用javascript步骤代替。
样式问题
往模板文件中写数据,应该保留样式不要改变,所以在Excel Writer步骤的相应的选项选中。
另外工作簿中的公式需要重新计算,因为Excel版本、文件类型以及可能其他的一些情况,当打开生成的文件时不自动更新计算单元格的值,Excel写步骤可以用自动重新计算单元格公式,有相应的选项供使用,但是一些函数或命名类型暂时不被poi库支持,可能报错,尝试重新编写公式、更改xls文件类型或手工激活技术(ctrl+shift+alt+F9)。