// Таблица1 (2)
let
Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
ToRows = List.Buffer(Table.ToRows(Source)),
fn = (j)=> let
a = List.Generate(
()=>[i=j+1,v=ToRows{i},s=v{1}],
each if [i]<List.Count(ToRows)
then Number.Round([s],10)<=Number.Round(ToRows{j}{1},10)
else false,
each [i=[i]+1,v=ToRows{i},s=[s]+v{1}],each [v]
),
b = {List.Count(a)+j+1,ToRows{j}{0},Table.FromRows(a)}
in b,
Generate = List.Generate(
()=>fn(0),
each _{0}<=List.Count(ToRows),
each fn(_{0}),
each List.Skip(_,1)
),
Custom1 = Table.FromRows(Generate,
{"Статьи","tb"}
),
Expand = Table.ExpandTableColumn(Custom1, "tb", {"Column1", "Column2"}),
Pivot = Table.Pivot(Expand, List.Distinct(Expand[Column1]), "Column1", "Column2")
in
Pivot
В условиях отсуствия справочника какие строки к какому уровню иерархии относятся можно разобрать структуру вот так. НО! Это не четкий поиск, который при определенных условиях может давать некорректный результат. Однако какой пример, такое и решение. Таких нечетких разборов можно еще один алгоритм собрать, но сейчас времени нет. Здесь использована функция из моего же решения такой же задачи в этой теме. Если кто из гуру вдруг надумает критиковать функцию, то я знаю, что её можно оптимизировать, и вместо записей работать ос списками, а также сделать её полностью универсальной для любого количества уровней, а не только для четырех. Но пока вот лично мне в работе такое не потребуется (что маловероятно ) за оптимизацию даже не возьмусь. Просто вот тогда мне задачка запала, можно ли хоть как-то разобрать сжатую структуру сводной.
Скрытый текст
let FnCalcLevels=(subastable,colastext)=> let itemCount=Table.RowCount(sub), sumList=List.Buffer(List.Reverse(Table.ToColumns(Table.SelectColumns(sub,{col})){0})), calcRunningTotal=List.Generate( ()=>[id=0,lev=0,runSum=[0=sumList{id},1=null,2=null,3=null,4=null]], each[id]<itemCount, each[id=[id]+1,lev=ifNumber.Round(List.Sum({Record.ToList([runSum]){[lev]},-sumList{id}}),8)=0then[lev]+1else0,runSum=Record.TransformFields( [runSum], List.Transform({0..lev},each{Text.From(_),(x)=>List.Sum({x,sumList{id}})*Number.From(_=lev)}) )], each[lev] ), result=Table.FromColumns(Table.ToColumns(sub)&{List.Reverse(calcRunningTotal)},Table.ColumnNames(sub)&{"Level"}) in result, Source=Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content], Levels=FnCalcLevels(Source,"Значения"), AddedRows=Table.AddColumn(Levels,"Rows",eachList.Reverse(List.ReplaceRange(List.Repeat({null},List.Count(List.Distinct(Levels[Level]))),[Level],1,{[Статьи]}))&{[Значения]}), Custom1=Table.FromRows(AddedRows[Rows],List.Transform(List.Distinct(Levels[Level]),Text.From)&{"Значения"}), FilledDown=Table.FillDown(Custom1,{"1"}), FilteredRows=Table.SelectRows(FilledDown,each([0]<>null)), PivotedColumn=Table.Pivot(FilteredRows,List.Distinct(FilteredRows[#"0"]),"0","Значения") in PivotedColumn
З.Ы. О а у Андрея как раз была оптимизированная функция! Снимаю шляпу. Чудесный код.
PooHkrd написал: у Андрея как раз была оптимизированная функция!
вот только она для одного уровня вложенности, для многоуровневых структур нужно будет рекурсию думать, но, имхо, проще будет выковырять стили из xml и трансформировать уже опираясь на них