
编辑:我认为我必须承认,正如其他一些人(他们从未留下过我的评论)所指出的那样,我的答案的上一版本(您接受了)存在一个错误,该错误使其无法正确处理大于
702(对应于Excel列
'ZZ')。因此,为了正确起见,以下代码已对其进行了修复,该代码现在像其他许多答案一样包含一个循环。
您很可能从未使用过具有足够大列号的先前版本来遇到此问题。FWIW,当前版本的Excel的MS规范说,它支持最多包含16,384列(Excel列
'XFD')的工作表。
LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'def excel_style(row, col): """ Convert given row and column number to an Excel-style cell name. """ result = [] while col: col, rem = divmod(col-1, 26) result[:0] = LETTERS[rem] return ''.join(result) + str(row)if __name__ == '__main__': addresses = [(1, 1), (1, 26), (1, 27), (1, 52), (1, 53), (1, 78), (1, 79), (1, 104), (1, 18253), (1, 18278), (1, 702), # -> 'ZZ1' (1, 703), # -> 'AAA1' (1, 16384), # -> 'XFD1' (1, 35277039)] print('({:3}, {:>10}) --> {}'.format('row', 'col', 'Excel')) print('==========================') for row, col in addresses: print('({:3}, {:10,}) --> {!r}'.format(row, col, excel_style(row, col)))输出:
(row, col) --> Excel========================( 1, 1) --> 'A1'( 1, 26) --> 'Z1'( 1, 27) --> 'AA1'( 1, 52) --> 'AZ1'( 1, 53) --> 'BA1'( 1, 78) --> 'BZ1'( 1, 79) --> 'CA1'( 1, 104) --> 'CZ1'( 1, 18253) --> 'ZZA1'( 1, 18278) --> 'ZZZ1'( 1, 702) --> 'ZZ1'( 1, 703) --> 'AAA1'( 1, 16384) --> 'XFD1'( 1, 35277039) --> 'BYEBYE1'
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)