Ответ 1

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

Ответ 2

Библиотека 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'

Обратите внимание, что он использует нулевое индексирование.

Ответ 3

Просто для людей, которые все еще интересуются этим. Выбранный ответ @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]

Ответ 4

Отредактировано после тяжелой любви от Meta​​strong >

Процедура для этого включает деление числа на 26 до тех пор, пока вы не достигнете числа меньше 26, каждый раз оставив остаток и добавив 65, так как 65 - это где "A" находится в Таблица ASCII. Прочитайте ASCII, если это не имеет смысла для вас.

Обратите внимание, что как и изначально связанный вопрос, это основано на 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

Ответ 6

Мой рецепт для этого был вдохновлен другим ответом на произвольное преобразование базы (fooobar.com/questions/41814/...)

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

Ответ 7

Эта простая функция 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

Ответ 8

Рекурсивное однострочное решение без библиотек

def column(num, res = ''):
   return column((num - 1) // 26, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[(num - 1) % 26] + res) if num > 0 else res

Ответ 9

Просто, чтобы усложнить все, я добавил кеширование, поэтому имя того же столбца будет вычисляться только один раз. Решение основано на рецепте by @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

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)