Convertir el número de la hoja de cálculo en una columna.

Estoy buscando lo opuesto a esta pregunta y respuesta: Convierta una letra de una columna de Excel o de una hoja de cálculo a su número de manera Pythonic .

o este, pero en python Cómo convertir un número de columna (por ejemplo, 127) en una columna de Excel (por ejemplo, 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 

La biblioteca xlsxwriter incluye una función de conversión, xlsxwriter.utility.xl_col_to_name(index) y está en github

Aquí hay un ejemplo de trabajo:

 >>> 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' 

Tenga en cuenta que está utilizando indexación cero.

Sólo para la gente que sigue interesada en esto. La respuesta elegida por @Marius da resultados incorrectos en algunos casos, como lo comenta @jspurim. Aquí está mi respuesta.

 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] 

Editado después de un duro amor de Meta.

El procedimiento para esto implica dividir el número por 26 hasta que haya alcanzado un número menor que 26, tomar el rest cada vez y agregar 65, ya que 65 es donde ‘A’ está en la tabla ASCII . Lea sobre ASCII si eso no tiene sentido para usted.

Tenga en cuenta que al igual que la pregunta vinculada originalmente , esta se basa en 1 en lugar de en cero, por lo que 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)) 

Ejemplo de salida:

 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 

Mi receta para esto se inspiró en otra respuesta sobre la conversión de base arbitraria ( 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] 

Ejemplo:

 for i in range(23,30): print (i,n2a(i)) 

salidas

 23 X 24 Y 25 Z 26 AA 27 AB 28 AC 29 AD 

Esta sencilla función de Python funciona para columnas con 1 o 2 letras.

 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 

Solución recursiva de una línea sin bibliotecas

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

La biblioteca openpyxl incluye la función de conversión (entre otras) que está buscando, 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' 

Solo para complicar un poco todo, agregué el almacenamiento en caché, por lo que el nombre de la misma columna se calculará solo una vez. La solución se basa en una receta de @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)] 

Ejemplo de uso:

 column = ColumnName() for cn in range(1, 40): print column[cn] for cn in range(1, 50): print column[cn]