Я ищу противоположность этому Q & A: Преобразует буква столбца Excel или таблицы в его число в стиле Pythonic.
или этот, но в python Как преобразовать номер столбца (например, 127) в столбец excel (например, AA)
Я ищу противоположность этому Q & A: Преобразует буква столбца Excel или таблицы в его число в стиле Pythonic.
или этот, но в python Как преобразовать номер столбца (например, 127) в столбец excel (например, AA)
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
Библиотека 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'
Обратите внимание, что он использует нулевое индексирование.
Просто для людей, которые все еще интересуются этим. Выбранный ответ @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]
Отредактировано после тяжелой любви от Metastrong >
Процедура для этого включает деление числа на 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
библиотека 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'
Мой рецепт для этого был вдохновлен другим ответом на произвольное преобразование базы (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
Эта простая функция 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
Рекурсивное однострочное решение без библиотек
def column(num, res = ''):
return column((num - 1) // 26, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[(num - 1) % 26] + res) if num > 0 else res
Просто, чтобы усложнить все, я добавил кеширование, поэтому имя того же столбца будет вычисляться только один раз. Решение основано на рецепте 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]
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)