我正在寻找与此Q& A:Convert an excel or spreadsheet column letter to its number in Pythonic fashion相反的内容。
或者这个但是在python How to convert a column number (eg. 127) into an excel column (eg. AA)
中答案 0 :(得分:39)
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
答案 1 :(得分:14)
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'
请注意,它使用的是零索引。
答案 2 :(得分:5)
仅供人们对此感兴趣。 @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]
答案 3 :(得分:4)
在Meta 之后的一些强烈的爱情中编辑
此过程包括将数字除以26,直到达到小于26的数字,每次取余数并加65,因为65是ASCII table中的'A'。如果这对您没有意义,请阅读ASCII。
请注意,与originally linked question一样,这是基于1而不是从零开始,因此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
答案 4 :(得分:3)
openpyxl library包括您正在寻找的the conversion function 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'
答案 5 :(得分:2)
我的配方灵感来自于任意基本转换的另一个答案(https://stackoverflow.com/a/24763277/3163607)
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]
示例:
for i in range(23,30):
print (i,n2a(i))
输出
23 X
24 Y
25 Z
26 AA
27 AB
28 AC
29 AD
答案 6 :(得分:1)
这个简单的Python函数适用于带有1或2个字母的列。
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
答案 7 :(得分:1)
不带库的递归一线解决方案
def column(num, res = ''):
return column((num - 1) // 26, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[(num - 1) % 26] + res) if num > 0 else res
答案 8 :(得分:1)
这是一个递归解决方案:
def column_num_to_string(n):
n, rem = divmod(n - 1, 26)
char = chr(65 + rem)
if n:
return column_num_to_string(n) + char
else:
return char
column_num_to_string(28)
#output: 'AB'
也可以通过类似的方式递归定义逆:
def column_string_to_num(s):
n = ord(s[-1]) - 64
if s[:-1]:
return 26 * (column_string_to_num(s[:-1])) + n
else:
return n
column_string_to_num("AB")
#output: 28
答案 9 :(得分:0)
只是为了让一切变得复杂,我添加了缓存,因此同一列的名称只会计算一次。该解决方案基于@Alex Benfica的配方
import string
class ColumnName(dict):
def __init__(self):
super(ColumnName, self).__init__()
self.alphabet = string.uppercase
self.alphabet_size = len(self.alphabet)
def __missing__(self, column_number):
ret = self[column_number] = self.get_column_name(column_number)
return ret
def get_column_name(self, column_number):
if column_number <= self.alphabet_size:
return self.alphabet[column_number - 1]
else:
return self.alphabet[((column_number - 1) / self.alphabet_size) - 1] + self.alphabet[((column_number - 1) % self.alphabet_size)]
用法示例:
column = ColumnName()
for cn in range(1, 40):
print column[cn]
for cn in range(1, 50):
print column[cn]
答案 10 :(得分:0)
import math
num = 3500
row_number = str(math.ceil(num / 702))
letters = ''
num = num - 702 * math.floor(num / 702)
while num:
mod = (num - 1) % 26
letters += chr(mod + 65)
num = (num - 1) // 26
result = row_number + ("".join(reversed(letters)))
print(result)
答案 11 :(得分:0)
递归实施
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)
迭代实现
版本1 :使用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))
答案 12 :(得分:0)
import gspread
def letter2num(col_letter: str) -> int:
row_num, col_num = gspread.utils.a1_to_rowcol(col_letter + '1')
return col_num
def num2letter(col_num: int) -> str:
return gspread.utils.rowcol_to_a1(1, col_num)[:-1]
# letter2num('D') => returns 4
# num2letter(4) => returns 'D'
答案 13 :(得分:0)
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(50)
print _column(100)
print _column(260)
print _column(270)
输出: 一种 斧头 简历 伊兹 JJ