我正在寻找与这个问答相反的内容:以Python风格将Excel或电子表格列字母转换为其数字.
或者在Python中转换一个列编号(例如127)为Excel列(例如AA)的问题,可以参考以下内容:如何将列编号(例如127)转换为Excel列(例如AA)
我正在寻找与这个问答相反的内容:以Python风格将Excel或电子表格列字母转换为其数字.
或者在Python中转换一个列编号(例如127)为Excel列(例如AA)的问题,可以参考以下内容:如何将列编号(例如127)转换为Excel列(例如AA)
start_index = 1 # it can start either at 0 or at 1
letter = ''
while column_int > 25 + start_index:
letter += chr(65 + int((column_int-start_index)/26) - 1)
column_int = column_int - (int((column_int-start_index)/26))*26
letter += chr(65 - start_index + (int(column_int)))
n += 1
- RandomDudelist
并转换为字符串 "".join(lst)
。 - BrayoniÙV
,这相当不寻常 :) - Piotr Wasilewiczxlsxwriter库包括一个转换函数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'
需要注意的是,它使用了从零开始的索引。
AC
而不是 AB
,通过将输入数字减去 1 可以得到预期输出 AB
,但您知道为什么会发生这种情况吗? - akash karothiya我对此的处理方式受到另一个关于任意进制转换的答案的启发(https://dev59.com/kXI95IYBdhLWcg3w_zMN#24763277)
def n2a(n):
d, m = divmod(n,26) # 26 is the number of ASCII letters
return '' if n < 0 else n2a(d-1)+chr(m+65) # chr(65) = 'A'
例子:
print (-1,n2a(-1))
print (0,n2a(0))
for i in range(23,30):
print (i,n2a(i))
输出
-1
0 A
23 X
24 Y
25 Z
26 AA
27 AB
28 AC
29 AD
在 Meta 的狠心敲打下进行了修改
这个过程需要将数字除以 26,直到你得到一个小于 26 的数字为止,每次取余数并加上 65,因为在 ASCII 表 中,65 是 'A' 所在的位置。如果你不明白,请阅读有关 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))
示例输出:
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
num_to_col_letters(26)
的输出结果是错误的,它输出了 "A@"
。 - jspurim对于仍然对此感兴趣的人。由@Marius选择的答案在某些情况下会给出错误的输出,如@jspurim所评论的那样。以下是我的答案。
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]
不借助任何库的递归一行解决方案
def column(num, res = ''):
return column((num - 1) // 26, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[(num - 1) % 26] + res) if num > 0 else res
递归实现
import string
def spreadsheet_column_encoding_reverse_recursive(x):
def converter(x):
return (
""
if x == 0
else converter((x - 1) // 26) + string.ascii_uppercase[(x - 1) % 26]
)
return converter(x)
迭代实现
第一版本:使用 chr
,ord
函数。
def spreadsheet_column_encoding_reverse_iterative(x):
s = list()
while x:
x -= 1
s.append(chr(ord("A") + x % 26))
x //= 26
return "".join(reversed(s))
版本 2:使用 string.ascii_uppercase
import string
def spreadsheet_column_encoding_reverse_iterative(x):
s = list()
while x:
x -= 1
s.append(string.ascii_uppercase[x % 26])
x //= 26
return "".join(reversed(s))
版本 3: 使用 divmod
, chr
, ord
def spreadsheet_column_encoding_reverse_iterative(x):
s = list()
while x:
x, remainder = divmod(x - 1, 26)
s.append(chr(ord("A") + remainder))
return "".join(reversed(s))
def _column(aInt):
return chr((aInt - 1) // 26 + 64) + chr((aInt - 1) % 26 + 1 + 64) if aInt > 26 else chr(aInt + 64)
print _column(1)
print _column(27)
print _column(50)
print _column(100)
print _column(260)
print _column(270)
Output: A AA AX CV IZ JJ
def let(num):
alphabeth = string.uppercase
na = len(alphabeth)
if num <= len(alphabeth):
letters = alphabeth[num-1]
else:
letters = alphabeth[ ((num-1) / na) - 1 ] + alphabeth[((num-1) % na)]
return letters