我正在寻找与此问答相反的方法:将excel或电子表格列字母转换为Pythonic方式的数字.
或者这个但是在python中如何将列号(例如127)转换为excel列(例如AA)
sun*_*raj 48
def colnum_string(n):
string = ""
while n > 0:
n, remainder = divmod(n - 1, 26)
string = chr(65 + remainder) + string
return string
print(colnum_string(28))
#output:AB
Run Code Online (Sandbox Code Playgroud)
小智 19
所述xlsxwriter库包括一个转换功能,xlsxwriter.utility.xl_col_to_name(index)并且是github上
这是一个有效的例子:
>>> import xlsxwriter
>>> xlsxwriter.utility.xl_col_to_name(10)
'K'
>>> xlsxwriter.utility.xl_col_to_name(1)
'B'
>>> xlsxwriter.utility.xl_col_to_name(0)
'A'
Run Code Online (Sandbox Code Playgroud)
请注意,它使用的是零索引.
Bri*_*een 14
该openpyxl库包括的转换功能,你正在寻找的,(其中包括)get_column_letter:
>>> from openpyxl.utils.cell import get_column_letter
>>> get_column_letter(1)
'A'
>>> get_column_letter(10)
'J'
>>> get_column_letter(3423)
'EAQ'
Run Code Online (Sandbox Code Playgroud)
Gia*_*lli 10
我的配方灵感来自另一个关于任意基础转换的答案(/sf/answers/1733429421/)
import string
def n2a(n,b=string.ascii_uppercase):
d, m = divmod(n,len(b))
return n2a(d-1,b)+b[m] if d else b[m]
Run Code Online (Sandbox Code Playgroud)
例子:
for i in range(23,30):
print (i,n2a(i))
Run Code Online (Sandbox Code Playgroud)
产出
23 X
24 Y
25 Z
26 AA
27 AB
28 AC
29 AD
Run Code Online (Sandbox Code Playgroud)
在 Meta 的一些艰难的爱之后编辑
此过程涉及将数字除以 26,直到达到小于 26 的数字,每次取余数并添加 65,因为 65 是 'A' 在ASCII 表中的位置。如果这对您没有意义,请阅读 ASCII。
请注意,与最初链接的问题一样,这是从 1 开始的而不是从 0 开始的,因此A -> 1, B -> 2。
def num_to_col_letters(num):
letters = ''
while num:
mod = (num - 1) % 26
letters += chr(mod + 65)
num = (num - 1) // 26
return ''.join(reversed(letters))
Run Code Online (Sandbox Code Playgroud)
示例输出:
for i in range(1, 53):
print i, num_to_col_letters(i)
1 A
2 B
3 C
4 D
...
25 Y
26 Z
27 AA
28 AB
29 AC
...
47 AU
48 AV
49 AW
50 AX
51 AY
52 AZ
Run Code Online (Sandbox Code Playgroud)
只为人们仍然对此感兴趣.@Mspurim评论说@Marius选择的答案在某些情况下会输出错误的输出.这是我的答案.
import string
def convertToTitle(num):
title = ''
alist = string.uppercase
while num:
mod = (num-1) % 26
num = int((num - mod) / 26)
title += alist[mod]
return title[::-1]
Run Code Online (Sandbox Code Playgroud)
不带库的递归单行解决方案
def column(num, res = ''):
return column((num - 1) // 26, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[(num - 1) % 26] + res) if num > 0 else res
Run Code Online (Sandbox Code Playgroud)