
=LET(a,A1:E1,b,A2:E5,
c,TOCOL(IF(b="","",b)),
d,TOCOL(IF(b<>"",a,"")),
HSTACK(d,c))

表头,数据分别使用Tocol()函数,将其分别变成一列再用Hstack()函数横向连接,这里面嵌套了if()函数,如果不使用的话会是这个效果:

方法2,与方法1类似,使用了If+Sequence组合,只有标红色的部分是不同的
=LET(a,A1:E1,b,A2:E5,
c,TOCOL(IF(b="","",b)),
d,TOCOL(IF(SEQUENCE(ROWS(b),COLUMNS(b)),IF(a="","",a))),
HSTACK(d,c))

方法3,总体思路一致,不过这里使用了T+Sequence组合
=LET(a,A1:E1,b,A2:E5,
c,TOCOL(IF(b="","",b)),
d,TOCOL(a&T(SEQUENCE(ROWS(b),COLUMNS(b)))),
e,HSTACK(d,c),e)
T+Sequence组合的详细解释请参看前一篇文章:

方法4,这里就使用了Chooserows()函数
=IFERROR(DROP(
REDUCE("",ROW(2:5), LAMBDA(x,y,VSTACK(x,TRANSPOSE(CHOOSEROWS(A1:D5,1,y)),"")))
,1),"")
这里的核心就是:CHOOSEROWS(A1:D5,1,y),意思是每次遍历都提取第1行以及第y行,y=row(2:5)={2,3,4,5}, 比如遍历第一次的时候就提取第1,2行,第二次遍历的时候提取第1,3行,以此类推,嵌套transpose()是因为从横向变成纵向,每次遍历的结果纵向连接,drop()函数是用于删除第一行(为空行,累加器所致), 加Iferror()是清除里面的错误值。
