如何在Pentaho Data Integration中读取列名动态变化的Excel文件?
PDI处理动态列Excel并同步数据库字段方案
针对你遇到的Excel列每月增减、需同步数据库字段(只增不删)的需求,可按以下步骤实现:
1. 提取Excel当前所有列名
- 添加
Excel Input组件,配置目标Excel文件路径,勾选「Header row present」,设置「Number of rows to load」为1(仅读取列名行)。 - 添加
Columns to Rows组件,将所有列名转换为单列数据(输出字段命名为excel_column),最终得到一行一个列名的数据集。
2. 获取数据库表现有字段
- 添加
Database Query组件,执行对应数据库的字段查询语句:- MySQL/MariaDB:
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = '你的数据库名' AND TABLE_NAME = '目标表名' - PostgreSQL:
SELECT column_name FROM information_schema.columns WHERE table_schema = 'public' AND table_name = '目标表名' - SQL Server:
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_CATALOG = '你的数据库名' AND TABLE_NAME = '目标表名'
- MySQL/MariaDB:
- 输出字段命名为
db_column,得到数据库现有字段的数据集。
3. 对比列名并新增数据库字段
- 添加
Merge Rows (diff)组件:将Excel列名数据集设为「主步骤」,数据库字段数据集设为「对比步骤」,匹配字段选择excel_column和db_column。 - 用
Filter Rows组件筛选flag_field = 'new'的记录,即Excel新增的列。 - 添加
User Defined Java Class组件,拼接ALTER TABLE语句,示例代码片段:public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException { Object[] r = getRow(); if (r == null) { setOutputDone(); return false; } String colName = get(Fields.In, "excel_column").getString(r); // 可根据需求调整字段类型,此处默认用VARCHAR(255) String sql = "ALTER TABLE 目标表名 ADD COLUMN " + colName + " VARCHAR(255);"; get(Fields.Out, "alter_sql").setValue(r, sql); putRow(data.outputRowMeta, r); return true; } - 添加
Execute SQL Script组件,执行生成的ALTER语句,完成数据库字段新增。
4. 动态读取Excel数据并加载到数据库
- 重新添加
Excel Input组件,完整读取Excel所有数据(勾选「Header row present」,取消行数限制)。 - 添加
Table Output组件,配置目标数据库表,勾选「Specify database fields」,将数据库表的所有字段逐一列出:- Excel中存在的列:直接映射对应字段;
- Excel中已删除的列:设置字段值为
NULL(或对应默认值),确保数据库字段保留且新数据该字段为空。
- 运行作业/转换,即可实现Excel数据加载,同时保留数据库原有字段、同步新增字段。
内容的提问来源于stack exchange,提问作者user24857039
相关产品推荐
相关产品推荐

