使用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填充到列名的长度)。在
A-0
B-1
C-2
…
Z-25注:可使用标准base-26计算
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,…)
考虑到这些都是相当快速的算法,我很想看看是否有人知道一个明显更快的解决方案(当计算3宽度范围内的大量这些算法时,您可能需要这样的东西)。
P、 S.
需要注意的是,这些算法适用于任何使用excel命名算法的字母表,尤其是:
目前没有回答
相关问题 更多 >
编程相关推荐