Here's a simple iterative version that should handle arbitrary column numbers, adapted from the C# code at this answer:
How to convert a column number (eg. 127) into an excel column (eg. AA)
def column_label(column_number):
column_labels = []
column_number = column_number + 1
while column_number > 0:
column_number, modulo = divmod(column_number - 1, 26)
column_labels.append(string.uppercase[modulo])
return ''.join(reversed(column_labels))
This takes a 0-indexed column number, such as those xlrd and xlwt use. I don't love the conversion to 1-indexed before building the names, but I need to think more about the algorithm before replacing it.