如何在Power BI(DAX)及Excel中展开单元格内的字母数字范围并生成新行
在Power BI(DAX)和Excel中展开字母数字范围为单独行的方法
一、Power BI中用DAX实现
通过GENERATE函数遍历原表行,结合字符串提取与序列生成完成范围展开,具体DAX表达式如下:
展开后的表 = GENERATE( '原表', -- 替换为你的原始表名 VAR Prefix = LEFT( '原表'[列A], MINX( FILTER(GENERATESERIES(1, LEN('原表'[列A])), NOT ISNUMBER(VALUE(MID('原表'[列A], [Value], 1))) ) - 1 ) VAR StartNum = VALUE( MID( '原表'[列A], LEN(Prefix) + 1, FIND("-", '原表'[列A]) - LEN(Prefix) - 1 ) ) VAR EndNum = VALUE( MID( '原表'[列A], FIND("-", '原表'[列A]) + 1, LEN('原表'[列A]) - FIND("-", '原表'[列A]) ) ) RETURN SELECTCOLUMNS( GENERATESERIES(StartNum, EndNum), "列A", Prefix & [Value], "列B", '原表'[列B] ) )
逻辑说明
- 提取前缀字母:遍历字符串找到第一个数字的位置,截取之前的字母作为统一前缀;
- 拆分起止数字:从原范围字符串中提取起始、结束数字并转换为数值类型;
- 生成序列并拼接:用
GENERATESERIES生成起止数字间的所有整数,和前缀拼接成单个编号,同时保留原行的其他数据。
二、Excel中的实现方法
Excel可通过**Power Query(推荐)**或公式完成,前者适配大数据量且操作更直观。
方法1:Power Query(推荐)
- 选中原数据区域,点击「数据」→「从表格/区域」,导入到Power Query编辑器;
- 选中「列A」,点击「转换」→「拆分列」→「按分隔符」,以"-"拆分出「列A.1」和「列A.2」;
- 添加自定义列提取前缀:
重命名为「前缀」;= Text.Remove([列A.1], {"0".."9"}) - 添加自定义列提取起始数字:
重命名为「起始数字」;= Number.From(Text.Remove([列A.1], {"A".."Z"})) - 添加自定义列提取结束数字:
重命名为「结束数字」;= Number.From(Text.Remove([列A.2], {"A".."Z"})) - 添加自定义列生成数字序列:
重命名为「序列」;= List.Numbers([起始数字], [结束数字]-[起始数字]+1) - 点击「序列」列右侧的展开箭头,选择「展开到新行」;
- 添加自定义列拼接前缀和数字:
重命名为「列A」;= [前缀] & Text.From([序列]) - 删除多余中间列,保留「列A」和「列B」,点击「关闭并上载」得到结果。
方法2:公式法(适合小数据量)
假设原数据在A2:B3区域,在空白列(如D2)输入以下数组公式(输入后按Ctrl+Shift+Enter确认),下拉填充至出现空值:
=IFERROR(INDEX($B:$B,INT((ROW(D2)-2)/(MAX(VALUE(MID($A:$A,FIND("-",$A:$A)+1,LEN($A:$A)-FIND("-",$A:$A)))-VALUE(MID($A:$A,MIN(FILTER(ROW($1:$100),ISNUMBER(VALUE(MID($A:$A,ROW($1:$100),1))))),FIND("-",$A:$A)-MIN(FILTER(ROW($1:$100),ISNUMBER(VALUE(MID($A:$A,ROW($1:$100),1))))))+1)+2)&LEFT($A:$A,MIN(FILTER(ROW($1:$100),ISNUMBER(VALUE(MID($A:$A,ROW($1:$100),1)))))-1)&(VALUE(MID($A:$A,MIN(FILTER(ROW($1:$100),ISNUMBER(VALUE(MID($A:$A,ROW($1:$100),1))))),FIND("-",$A:$A)-MIN(FILTER(ROW($1:$100),ISNUMBER(VALUE(MID($A:$A,ROW($1:$100),1)))))))+MOD(ROW(D2)-2,MAX(VALUE(MID($A:$A,FIND("-",$A:$A)+1,LEN($A:$A)-FIND("-",$A:$A)))-VALUE(MID($A:$A,MIN(FILTER(ROW($1:$100),ISNUMBER(VALUE(MID($A:$A,ROW($1:$100),1))))),FIND("-",$A:$A)-MIN(FILTER(ROW($1:$100),ISNUMBER(VALUE(MID($A:$A,ROW($1:$100),1))))))+1)),"")
注:公式逻辑复杂,仅适合数据量较小的场景。
内容的提问来源于stack exchange,提问作者dookieface
相关产品推荐
相关产品推荐

