Pentaho PDI转换如何在Excel输出文件名中添加上周周数标识
PDI动态生成带上周周数标识Excel文件名的操作方法
你可以通过两种方案实现需求,操作步骤如下:
方案一:转换内生成字段传递(单转换场景首选,无需依赖作业)
- 在
Table input组件之前新增「用户自定义Java表达式」组件,新增一个字符串类型字段,命名为last_week_tag,写入对应逻辑代码生成YYYYWXX格式的上周标识:
适配Java 8及以上版本的代码(PDI 8.0及以上版本默认支持):
适配低版本PDI(不支持Java 8新时间API)的代码:import java.time.LocalDate; import java.time.temporal.WeekFields; import java.util.Locale; // 取上周日期 LocalDate lastWeek = LocalDate.now().minusWeeks(1); // 按国内周规则(周一为一周起始)配置,如需按其他地区规则修改Locale参数即可 WeekFields weekFields = WeekFields.of(Locale.CHINA); int year = lastWeek.get(weekFields.weekBasedYear()); int weekNum = lastWeek.get(weekFields.weekOfWeekBasedYear()); return String.format("%dW%02d", year, weekNum);import java.util.Calendar; import java.util.Locale; Calendar cal = Calendar.getInstance(Locale.CHINA); // 向前推1周 cal.add(Calendar.WEEK_OF_YEAR, -1); int year = cal.get(Calendar.YEAR); // 兼容跨年周逻辑 if (cal.get(Calendar.MONTH) == Calendar.JANUARY && cal.get(Calendar.WEEK_OF_YEAR) > 50) { year -= 1; } else if (cal.get(Calendar.MONTH) == Calendar.DECEMBER && cal.get(Calendar.WEEK_OF_YEAR) == 1) { year += 1; } int weekNum = cal.get(Calendar.WEEK_OF_YEAR); return String.format("%dW%02d", year, weekNum); - 调整
Select values组件的字段配置,保留last_week_tag字段,不要将其筛除。 - 打开
Microsoft Excel writer组件配置页:- 在文件名输入框中填写基础文件名格式,示例:
业务周度数据_${last_week_tag}.xlsx - 勾选「包含来自步骤的字段在文件名中」选项,在下拉字段列表中选择
last_week_tag,勾选「在文件名里使用字段」 - 如不需要将周标识字段写入Excel内容,可在组件的「字段」配置页删除
last_week_tag字段,不影响文件名引用
- 在文件名输入框中填写基础文件名格式,示例:
方案二:作业级定义变量(多转换复用周标识场景首选)
- 若你使用作业调度该转换,可在作业中新增「设置变量」组件,用上述代码生成
LAST_WEEK_TAG全局变量,作用域选择根作业级别。 - 转换的
Microsoft Excel writer组件直接引用变量${LAST_WEEK_TAG}到文件名即可,无需在转换内额外新增字段。
注意:如果需要调整周计算规则(比如周日为一周起始、自定义第一周判定标准),修改代码中Locale或者WeekFields的配置即可。
内容的提问来源于stack exchange,提问作者sbrbot
相关产品推荐
相关产品推荐

