Power Query读取Excel首列处理不一致 如何强制忽略首列统一合并
解决方法
第一步:修改自定义读取函数#"Transform File"
该函数是Power Query合并文件时自动生成的,负责读取单个Excel文件的内容,也是问题的核心调整点:
- 找到该查询中读取工作表原始数据的步骤,格式通常为
工作表数据 = 工作簿{[Item="你实际读取的工作表名称",Kind="Sheet"]}[Data] - 在该步骤后新增判断并删除全空首列的逻辑,保证处理后所有文件的第一列都是业务数据列,完整函数示例:
let Source = (FileContent as binary) as table => let 工作簿 = Excel.Workbook(FileContent, null, true), // 替换为你实际要读取的工作表名称 工作表数据 = 工作簿{[Item="Sheet1",Kind="Sheet"]}[Data], // 新增逻辑:判断首列是否全空,是则删除,否则保留 统一首列 = let 首列所有值 = Table.Column(工作表数据, "Column1"), 首列非空值 = List.RemoveNulls(首列所有值) in if List.IsEmpty(首列非空值) then Table.RemoveColumns(工作表数据, "Column1") else 工作表数据 in 统一首列 in Source
第二步:调整主查询路径
仅需要将主代码第一行Source = Folder.Files("")的引号内填写你存储Excel文件的文件夹完整路径即可,其余原有逻辑无需修改:
let // 替换为你的文件夹路径 Source = Folder.Files("C:\你的Excel文件存储文件夹路径"), #"Filtered Hidden Files1" = Table.SelectRows(Source, each [Attributes]?[Hidden]? <> true), #"Invoke Custom Function1" = Table.AddColumn(#"Filtered Hidden Files1", "Transform File", each #"Transform File"([Content])), #"Renamed Columns1" = Table.RenameColumns(#"Invoke Custom Function1", {"Name", "Source.Name"}), #"Removed Other Columns1" = Table.SelectColumns(#"Renamed Columns1", {"Source.Name", "Transform File"}), #"Expanded Table Column1" = Table.ExpandTableColumn(#"Removed Other Columns1", "Transform File", Table.ColumnNames(#"Transform File"(#"Sample File"))), #"Changed Type" = Table.TransformColumnTypes(#"Expanded Table Column1",{{"Source.Name", type text}, {"Column1", type text}, {"Column2", type any}, {"Column3", type text}, {"Column4", type text}, {"Column5", type any}, {"Column6", type text}, {"Column7", type text}, {"Column8", type text}, {"Column9", type text}, {"Column10", type any}, {"Column11", type text}, {"Column12", type any}, {"Column13", type any}, {"Column14", type any}, {"Column15", type any}, {"Column16", type any}, {"Column17", type any}, {"Column18", type any}, {"Column19", type any}, {"Column20", type any}}), #"Renamed Columns" = Table.RenameColumns(#"Changed Type",{{"Column1", "שם המנפיק/שם נייר ערך"}, {"Column2", "מספר ני""ע"}, {"Column3", "זירת מסחר"}, {"Column4", "ספק מידע"}, {"Column5", "מספר מנפיק"}, {"Column6", "ענף מסחר"}, {"Column7", "דירוג"}, {"Column8", "שם מדרג"}, {"Column9", "תאריך רכישה"}, {"Column10", "מח""מ"}, {"Column11", "סוג מטבע"}, {"Column12", "שיעור ריבית"}, {"Column13", "תשואה לפידיון"}, {"Column14", "ערך נקוב"}, {"Column15", "שער"}, {"Column16", "פדיון/ ריבית לקבל"}, {"Column17", "שווי שוק"}, {"Column18", "שעור מערך נקוב מונפק"}, {"Column19", "שעור מנכסי אפיק ההשקעה"}, {"Column20", "שעור מסך נכסי השקעה"}}), #"Changed Type1" = Table.TransformColumnTypes(#"Renamed Columns",{{"מח""מ", type number}, {"שיעור ריבית", Percentage.Type}, {"תשואה לפידיון", Percentage.Type}, {"ערך נקוב", type number}, {"שער", type number}, {"פדיון/ ריבית לקבל", type number}, {"שווי שוק", type number}, {"שעור מערך נקוב מונפק", Percentage.Type}, {"שעור מנכסי אפיק ההשקעה", Percentage.Type}, {"שעור מסך נכסי השקעה", Percentage.Type}}), #"Renamed Columns2" = Table.RenameColumns(#"Changed Type1",{{"שם המנפיק/שם נייר ערך", "שם ני""ע"}}), #"Added Custom" = Table.AddColumn(#"Renamed Columns2", "Custom", each "אגרות חוב קונצרניות"), #"Filtered Rows" = Table.SelectRows(#"Added Custom", each true), #"Changed Type2" = Table.TransformColumnTypes(#"Filtered Rows",{{"סוג מטבע", type text}}), #"Filtered Rows1" = Table.SelectRows(#"Changed Type2", each true) in #"Filtered Rows1"
逻辑说明
- 对于读取时保留了空首列的文件:判断首列全空后直接删除,原有业务列依次前移一位,第一列对应业务首列
- 对于读取时自动删除了空首列的文件:判断首列有非空值,直接保留原有列结构
两种场景最终输出的列索引完全一致,合并后不会出现数据错位问题。
内容的提问来源于stack exchange,提问作者baruch
相关产品推荐
相关产品推荐

