如何用Excel Power Query批量处理PDF多页同格式表格并合并结果?
批量处理PDF多表格的Power Query解决方案
单个PDF批量处理所有表格
无需手动复制修改查询,通过遍历PDF返回的所有表格并批量执行处理逻辑,即可合并所有结果:
let // 加载目标PDF的所有表格元数据 Source = Pdf.Tables(File.Contents("C:\path\to\file.pdf"), [Implementation="1.3"]), // 为每个表格添加处理后的结果列 ProcessTables = Table.AddColumn(Source, "ProcessedTable", each let TableData = [Data], ChangedType = Table.TransformColumnTypes(TableData,{{"Column1", type text}, {"Column2", type text}}), Transposed = Table.Transpose(ChangedType), PromotedHeaders = Table.PromoteHeaders(Transposed, [PromoteAllScalars=true]) in PromotedHeaders ), // 移除无关的元数据列 CleanedTable = Table.RemoveColumns(ProcessTables, {"Id", "Kind", "Data"}), // 展开所有处理后的表格,合并为单一数据集 CombinedTables = Table.ExpandTableColumn(CleanedTable, "ProcessedTable", Table.ColumnNames(Table.First(CleanedTable[ProcessedTable])) ) in CombinedTables
代码说明
Source会加载PDF中所有表格的元数据(每行对应一个表格)ProcessTables列将你原来的单表处理逻辑封装,自动应用到每个表格CombinedTables展开所有处理后的表格,完成数据合并
多PDF文件批量处理
如果需要处理文件夹下的多个PDF,只需在上述逻辑外层套一层文件遍历:
let // 指定PDF文件夹路径 FolderPath = "C:\path\to\pdf-folder", // 加载文件夹内所有文件并筛选PDF SourceFiles = Folder.Files(FolderPath), FilteredPDFs = Table.SelectRows(SourceFiles, each [Extension] = ".pdf"), // 处理每个PDF内的所有表格 ProcessEachPDF = Table.AddColumn(FilteredPDFs, "AllTables", each let PDFSource = Pdf.Tables(File.Contents([Folder Path]&[Name]), [Implementation="1.3"]), ProcessTables = Table.AddColumn(PDFSource, "ProcessedTable", each let TableData = [Data], ChangedType = Table.TransformColumnTypes(TableData,{{"Column1", type text}, {"Column2", type text}}), Transposed = Table.Transpose(ChangedType), PromotedHeaders = Table.PromoteHeaders(Transposed, [PromoteAllScalars=true]) in PromotedHeaders ), CleanedTable = Table.RemoveColumns(ProcessTables, {"Id", "Kind", "Data"}), CombinedTables = Table.ExpandTableColumn(CleanedTable, "ProcessedTable", Table.ColumnNames(Table.First(CleanedTable[ProcessedTable])) ) in CombinedTables ), // 合并所有PDF的处理结果 FinalCombined = Table.ExpandTableColumn(ProcessEachPDF, "AllTables", Table.ColumnNames(Table.First(ProcessEachPDF[AllTables])) ), // 可选:保留文件名,方便追溯数据来源 KeepFileName = Table.SelectColumns(FinalCombined, {"Name"} & Table.ColumnNames(Table.First(ProcessEachPDF[AllTables]))) in KeepFileName
注意事项
- 确保所有PDF内的表格结构完全一致,否则合并时会出现列不匹配错误
- 若表格列名存在差异,可在
PromotedHeaders后添加Table.RenameColumns统一列名 - PDF文件更新后,只需刷新Power Query连接即可自动加载最新数据
内容的提问来源于stack exchange,提问作者Ian Robertson
相关产品推荐
相关产品推荐

