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

时间:2019-12-18 15:33:08

标签: excel powerquery

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

Examples:
A=1
Z=26
AA=27
AZ=52
SZ=520
XFD=16384

我有一个Power Query脚本,正在读取Excel .xlsx文件中的.xml。它正在返回包含颜色的单元格,但返回的值为AZ123格式。我可以将列与行分开,但是现在我想将列转换为数字。

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

Here (VBA)here (C#, JS)是其他语言中的一些算法示例,但我不知道如何用M编写。

奖金请求:您可以将其编写为M函数,以便轻松重用吗?

1 个答案:

答案 0 :(得分:3)

您应该能够通过计算列中的一些列表功能来做到这一点:

List.Accumulate(
    List.Transform(
        Text.ToList([ColumnLetters]),
        each Character.ToNumber(_) - 64
    ), 0,
    (state, current) => state*26 + current
)

让我们看一个例子:

Text.ToList("XFD") = {"X", "F", "D"}

List.Transform({"X", "F", "D"}, each Character.ToNumber(_) - 64)
    = {88-64, 70-64, 68-64}
    = {24, 6, 4}

注意:对于偏移Character.ToNumber为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

注意:List.Accumulate会按照您在每个元素处指定的规则递归地遍历列表。