列番号からExcel形式の列名を取得する 質問する

列番号からExcel形式の列名を取得する 質問する

これは、行と列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'

おすすめ記事