Power Query高效处理PDF多重复表格:转置后合并为单表
高效解决方案:批量处理PDF重复表格并合并
方案1:封装转换逻辑为自定义函数,批量应用到所有PDF表格
这是最直接的解决方式,避免手动复制查询的重复劳动:
封装单个表格的转换逻辑为自定义函数
- 先完成单个表格的完整转换(转置、提取字段、删冗余行),打开
Advanced Editor,将代码修改为函数格式:(inputTable as table) as table => let TransposedTable = Table.Transpose(inputTable), PromotedHeaders = Table.PromoteHeaders(TransposedTable, [PromoteAllScalars=true]), AddedAccount = Table.AddColumn(PromotedHeaders, "Account", each [report.field("Account")]), AddedAmount = Table.AddColumn(PromotedHeaders, "Amount", each [report.field("Amount")]), RemovedRedundant = Table.SelectColumns(AddedAmount, {"Account", "Amount"}) in RemovedRedundant - 将这个查询保存为自定义函数(比如命名为
fn_TransformSingleTable)。
- 先完成单个表格的完整转换(转置、提取字段、删冗余行),打开
批量导入PDF所有页面的表格并应用函数
- 新建查询,导入目标PDF:
let Source = Pdf.Tables(File.Contents("C:\你的文件路径\目标文件.pdf"), [Implementation="1.3"]), // 提取所有页面的表格列表 AllTables = Source{[Name="Table"]}[Data][[Table]], // 对每个表格应用自定义转换函数 TransformedTables = List.Transform(AllTables, fn_TransformSingleTable), // 合并所有转换后的表格为单表 CombinedResult = Table.Combine(TransformedTables) in CombinedResult - 运行查询后直接得到合并好的数据库表。
- 新建查询,导入目标PDF:
方案2:处理整份PDF导入后的表头分列问题
如果导入整份PDF得到的是一个大表但表头分列,可以先拆分再转换:
拆分大表为每页子表
- 先给大表添加索引列,根据每页的固定行数拆分:
let Source = Pdf.Tables(File.Contents("C:\你的文件路径\目标文件.pdf"), [Implementation="1.3"]), FullTable = Source{[Name="Table"]}[Data], AddedIndex = Table.AddIndexColumn(FullTable, "Index", 0, 1), // 假设每页表格占10行,按行数拆分列表 SplitTables = List.Split(AddedIndex[#"Column1"], 10), // 转换列表为表格集合 TableCollection = List.Transform(SplitTables, (x) => Table.FromList(x, Splitter.SplitByNothing(), null, null, ExtraValues.Error)) in TableCollection
- 先给大表添加索引列,根据每页的固定行数拆分:
应用自定义函数合并
- 直接用方案1中的
fn_TransformSingleTable对TableCollection列表做转换,再用Table.Combine合并即可。
- 直接用方案1中的
注意事项
- 如果PDF中存在少量结构不一致的表格,可在自定义函数中添加容错判断,比如用
Table.HasColumns检查必要字段是否存在,避免转换报错。 - 调整
Pdf.Tables的参数(如StartPage/EndPage)可指定处理的页码范围,提升效率。
内容的提问来源于stack exchange,提问作者Chris Casselli
相关产品推荐
相关产品推荐

