一、
通过观察,不难发现Excel的列名命名规则,本质是一个26进制。只不过正常的十进制是0~9,而Excel的列名是1~26。
把A~Z对应成1~26,最好的做法,就是采用ASCII码。A~Z的ASCII码对应65~90。
python内置了一个获取ASCII码的函数,ord()。
比如:ord("A")就是65,ord("F")就是70。
所以,ASCII码减去64,正好就是把A~Z,从1~26编号。
二、
Excel最多16834列,也就是XFD列,所以我们只需要考虑最多3个字母的情况:
a.一位字母:A~Z,直接用ord()-64即可;
b.两位字母:Z列再加1列的时候,每满26进1,就是AA列。第一位字母的编号乘26,加上第二位数字的编号,正好就是实际序号;
c.三位字母:在两位字母的情况下,又多了一位。当ZZ列,再加1的时候,就会变成AAA。ZZ列是26*26+26,也就是702列。也就是说,三位字母的时候,第一列的每一个1,都相当于26*26*26。
至此,得到具体代码如下:
if len(col_name)==1:
col_int = ord(col_name) - 64
elif len(col_name)==2:
col_int = (ord(col_name[0])- 64) * 26 + ord(col_name[1]) - 64
else:
col_int = (ord(col_name[0]) - 64) * 26 * 26 + (ord(col_name[1])- 64) * 26 + ord(col_name[2]) - 64
三、
上面代码还有没有优化空间呢?
其实是有的,我们可以把不足三位的列名,补齐到三位,这样就只需要考虑len(col_name)为3的情况就可以。
这里我们巧妙的采用@符号的ASCII码为64这一特点,用@符号去补齐不足三位的情况。这样,当不足三位的时候,前面多出来的@符号,64-64正好等于0,就不会影响最终结果。
具体代码如下:
#用zfill函数,把不足3位的列名,前面补上0。再用replace把0替换成@
col_name = col_name.zfill(3).replace('0','@')
col_int = (ord(col_name[0]) - 64) * 26 * 26 + (ord(col_name[1])- 64) * 26 + ord(col_name[2]) - 64