使用Power Query将Excel列字母转换为数字

使用Power Query将Excel列字母转换为数字,excel,powerquery,Excel,Powerquery,使用Power Query M语言,如何将Excel样式的列字母转换为相应的列号 Examples: A=1 Z=26 AA=27 AZ=52 SZ=520 XFD=16384 我有一个powerquery脚本,它正在读取Excel.xlsx文件中的.xml。它返回包含颜色的单元格,但返回的值采用AZ123格式。我可以将列与行分开,但现在我希望将列转换为数字 我已经知道如何使用VBA函数使用ColumnNumber=Range(ColumnLetters&“1”).column将列字母转换为数

使用Power Query M语言,如何将Excel样式的列字母转换为相应的列号

Examples:
A=1
Z=26
AA=27
AZ=52
SZ=520
XFD=16384
我有一个powerquery脚本,它正在读取Excel.xlsx文件中的.xml。它返回包含颜色的单元格,但返回的值采用
AZ123
格式。我可以将列与行分开,但现在我希望将列转换为数字

我已经知道如何使用VBA函数使用
ColumnNumber=Range(ColumnLetters&“1”).column
将列字母转换为数字,但我想在Power Query中完成处理

还有其他语言中的一些算法示例,但我不知道如何用M编写


奖金要求:您能否将其编写为M函数,以便易于重用?

您应该能够使用计算列中的一些列表函数来实现这一点:

List.Accumulate(
    List.Transform(
        Text.ToList([ColumnLetters]),
        each Character.ToNumber(_) - 64
    ), 0,
    (state, current) => state*26 + current
)
让我们通过一个例子来了解它是如何工作的:

Text.ToList(“XFD”)={“X”、“F”、“D”}

注意:对于偏移量64,您需要确保字母是大写的

List.Accumulate({24, 6, 4}, 0, (state, current) => state*26 + current)
    = ((0*26 + 24)*26 + 6)*26 + 4
    = 4 + 6*26 + 24*26^2
    = 16348

注意:应用您在每个元素上指定的规则,递归地逐步遍历列表。

您介意发布您正在使用的脚本吗?下面是我开始使用的脚本的一个示例,它可以从Excel中识别颜色单元格:这超出了这个问题的范围。想象一下一个列中有“AA”的power查询,我想让另一列将其转换为27。你能解释一下为什么你注意到
List.Accumulate
使用递归吗?内存使用率高吗?我只是解释一下它在做什么。该方法在内存方面相当有效。
List.Accumulate({24, 6, 4}, 0, (state, current) => state*26 + current)
    = ((0*26 + 24)*26 + 6)*26 + 4
    = 4 + 6*26 + 24*26^2
    = 16348