Excel列号到文本

2024-05-23 23:20:03 发布

您现在位置:Python中文网/ 问答频道 /正文

使用openpyxl时,有时我只能通过列名称而不是数字索引来引用Excel工作表中的列。我花了不少时间修补失败的解决方案,直到我想出了一个行之有效的通用方法。在

我想把这些信息归档,以供其他需要它的人使用。在

解决方案

输入:列号(1=A,2=B,…)
输出:excel中的列名

__alphabet = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
def convertColumnNumToLetter(column):
    converted = ""

    #figure out the width of the converted text
    columnCount = 1
    base = len(__alphabet)
    base_exponent = base
    exponent = 1
    while column > base_exponent:
        column = column - base_exponent
        exponent = exponent + 1
        columnCount = columnCount + 1
        base_exponent = base_exponent * base

    #calculate the actual column name
    column = column - 1
    while len(converted) < columnCount:
        digit = column % base
        column = (column - digit) // base
        converted = __alphabet[digit] + converted

    return converted

上面的方法首先计算列名的宽度,然后使用标准的base-n计算,a=0,B=1,…,Z=25(强制用0填充到列名的长度)。在

计算列名的宽度:

1-宽度列(文本名称、索引)

A-0
B-1
C-2

Z-25注:可使用标准base-26计算

2-宽度列(文本名称、索引)

AA-26=26+0注意:这里的26代表我们刚刚通过的26个A->;Z列
AB-27=26+1
AC-28=26+2

AZ-51=26+25
BA-52=26+26+0注意:第二个26代表我们刚刚通过的AA->;AZ列
BB-53=26+26+1

BZ-77=26+26+25

ZZ-?=26+26*25+25注意:26乘以25是我们刚刚通过的AA->;BZ列

注意:忽略2宽度列的每个和中的前26个,我们可以看到2宽度的列只是以26为底的值(填充到Width-2)。

结论

事实证明,这种模式还在继续。因此,上述解决方案基于以下观察结果:宽度1的列是<;26;宽度2的列是<;26+26^2,宽度3的列是<;26+26^2+26^3。

如果我们计算列宽,我们已经注意到,我们只需计算base-26列名(A=0,B=1,…,Z=25),将值填充到适当的宽度,就可以得到正确的列名。在

对于相关方,这里是逆函数(根据excel列名计算列号):

解决方案

输入:excel中的列名
输出:列号(1=A,2=B,…)

^{pr2}$

考虑到这些都是相当快速的算法,我很想看看是否有人知道一个明显更快的解决方案(当计算3宽度范围内的大量这些算法时,您可能需要这样的东西)。

P、 S.
需要注意的是,这些算法适用于任何使用excel命名算法的字母表,尤其是:

  • 字母表是严格有序的(A<;B<;C<;D。。。&例如lt;Z)
  • 列以齿轮方式命名,第一个字母值长度使用1个齿轮,下一个字母长度^2使用2个齿轮,依此类推
  • 列的命名顺序是,n个齿轮都从最小的元素开始,然后继续向上

Tags: thelt名称算法base宽度column解决方案