Excel 每 N 列内容填成一行
Excel表格从第 2 列起,每 N 列为一组,以 N=2 为例:
A | B | C | D | E | F | G | |
1 | ID | Type 1 | Count 1 | Type 2 | Count 2 | Type 3 | Count 3 |
2 | 1 | a | 640 | d | 290 | a | |
3 | 2 | d | 12000 | a | 1900 | f | 6000 |
4 | 3 | f | 48000 | f | 3600 | e | 1600 |
5 | 4 | c | 46000 | e | 3100 | b | 1200 |
6 | 5 | e | 47000 | c | 3400 | d | 1400 |
7 | 6 | b | 64000 | b | 3600 | c | 1200 |
现在要进列转行:每行的每 2 列内容填成一行,即扩展成 3 行;第 1 列 ID 保留;新增第 2 列 No 是扩展出来的行号:
A | B | C | D | |
1 | ID | No | Type | Count |
2 | 1 | 1 | a | 640 |
3 | 1 | 2 | d | 290 |
4 | 1 | 3 | a | |
5 | 2 | 1 | d | 12000 |
6 | 2 | 2 | a | 1900 |
7 | 2 | 3 | f | 6000 |
8 | 3 | 1 | f | 48000 |
9 | 3 | 2 | f | 3600 |
10 | 3 | 3 | e | 1600 |
使用 SPL XLL,输入公式:
=spl("=?.conj(ID=~(1),~.m(2:).group((#-1)\2).(ID|#|~))",A2:G7)
~.m(2:)从当前行的第2列开始取数据直到结尾,group函数将这些数据每2列分一组。
改成每 5 列一组,只要分组时把2改成 5。
https://stackoverflow.com/questions/78449082/using-power-query-to-unpivot-table
这样的题在实务中很常见,在 ExcelHome 网站上隔三差五就能看到这样的需求。
不得不说,SPL 在处理这种需求时确实方便高效,相比较于 Power Query 而言,SPL 天生具有索引,这一点非常友好,提供了极大的便利。Power Query 不存在天然索引,需在用到时人为创建索引号,这是不方便的地方,但其笛卡尔积展开 List.TransformMany 效率也是可以的,不用像 stackoverflow 上回帖中写的那样繁琐。以下是 Power Query 解法:
用 SPL 解此类需求时,个人愚见,用 ntile() 分块也挺好的,当然,如果要达成帖子开头处所说的从某列开始 N 列为一组动态生成,还有很多细节要考虑。比如,如果其中的一组是空的,得过滤掉,对吧,或者,表头如何实现动态,而不是一个一个手动敲,等等…