これは、行と列IDが指定されているときにCOLUMN名を提供するコードですが、のような値を指定するとrow = 1 and col = 104
、 が返されるはずですCZ
が、 が返されます。D@
row = 1
col = 104
div = col
column_label = str()
while div:
(div, mod) = divmod(div, 26)
column_label = chr(mod + 64) + column_label
print column_label
私がやっていることの何が間違っているのでしょうか?
(このコードは EXCEL 列の参照であり、行と列の ID 値を指定し、同じ値に対して ALPHABETIC 値を期待します。)
ベストアンサー1
注記702
この回答に現在表示されているコードは、あなたがそれを承認したときのコードとは異なります。これは、(Excel の列 に相当)より大きい列番号を適切に処理できないバグが見つかり、修正されたためです'ZZ'
。
おそらく、この問題が発生するほど大きな列番号を持つ以前のバージョンを使用したことがないのでしょう。参考までに、MicrosoftExcel の仕様と制限最大 1,048,576 行 × 16,384 列 (つまり列'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'