Вот один из способов справиться с вашим примером. Я начал с листа Excel под названием Sheet1, как показано ниже:
Затем в другой книге я создал запрос Power Query с этим M-кодом:
let
Source = Excel.Workbook(File.Contents("MyPath\MyFile.xlsx"), null, true),
Sheet1_Sheet = Source{[Item="Sheet1",Kind="Sheet"]}[Data],
#"Transposed Table" = Table.Transpose(Sheet1_Sheet),
#"Removed Blank Rows" = Table.SelectRows(#"Transposed Table", each not List.IsEmpty(List.RemoveMatchingItems(Record.FieldValues(_), {"", null}))),
#"Split Table by 3 Nested" = Table.Split(#"Removed Blank Rows",3),
#"Inserted Row Nested" = List.Transform(#"Split Table by 3 Nested", each Table.InsertRows(_, Table.RowCount(_),{Record.FromList(List.Repeat({null},Table.ColumnCount(_)),Table.ColumnNames(_))})),
#"Filled Category Down Nested" = List.Transform(#"Inserted Row Nested", each Table.FillDown(_,{"Column1"})),
#"Transposed Tables Nested" = List.Transform(#"Filled Category Down Nested", each Table.Transpose(_)),
#"Removed Blank Rows Nested" = List.Transform(#"Transposed Tables Nested", each Table.SelectRows(_, each not List.IsEmpty(List.RemoveMatchingItems(Record.FieldValues(_), {"", null})))),
#"Filled Category Down Nested2" = List.Transform(#"Removed Blank Rows Nested", each Table.FillDown(_,{"Column4"})),
#"Removed First LIne Nested" = List.Transform(#"Filled Category Down Nested2", each Table.Skip(_,1)),
#"Promoted First Line Nested" = List.Transform(#"Removed First LIne Nested", each Table.PromoteHeaders(_, [PromoteAllScalars=true])),
#"Renamed Category Column Nested" = List.Transform(#"Promoted First Line Nested", each Table.RenameColumns(_,{{Table.ColumnNames(_){3}, "Category"}})),
#"Combined Nested Tables" = Table.Combine(#"Renamed Category Column Nested"),
#"Reordered Columns" = Table.ReorderColumns(#"Combined Nested Tables",{"Category", "Header 1", "Header 2", "Header 3"})
in
#"Reordered Columns"
Чтобы получить этот результат:
Большая часть преобразовательной работы выполняется во вложенных таблицах с помощью List.Transform.