Kei Minagawa's Blog

皆川圭(@keimina)のブログ、Pythonで試したことを書いていきます

数値をエクセルの列を表すアルファベットに変換する関数

前回の記事で、数値をエクセルの列を表すアルファベットに変換するプログラムを自作しましたが、stackoverflow でもっと良い方法を見つけたため紹介いたします。そのコードを参考に関数を作成しました。このような問題は、みんながよく考えそうなことですから、自分で考えるより検索てヒントを見つけてからコーディングすれば良かったと後悔しています。

参考にした stackoverflow の記事は以下です。
stackoverflow.com

上記 stackoverflow の記事を参考に、Python で書き直して、ゼロ始まりか1始まりなのかを指定できるように関数化しました。いっちょまえに docstring も書いてみました。

数値をエクセルの列を表すアルファベットに変換する関数:

def colname(colx, index_mode="start_from_zero"):
    '''
    Return string of colx as excel column expression
    parameters:
        colx: int
            if `index_mode="start_from_one"`,
            colx is the nunber of column index start from 1.
            Otherwise or if `index_mode="start_from_zero"`,
            colx is the nunber of column index start from 0.
            (This is the default behavior.)

    return:
        colname: str
            Return string of colx as excel column alphabets expression
    
    >>> colname(0)
    'A'
    >>> colname(25)
    'Z'
    >>> colname(25 + 1)
    'AA'
    >>> colname(26*26 + 25)
    'ZZ'
    >>> colname(1, "start_from_one")
    'A'
    >>> colname(26, "start_from_one")
    'Z'
    >>> colname(26 + 1, "start_from_one")
    'AA'
    >>> colname(26*26 + 26, "start_from_one")
    'ZZ'
    '''
    if index_mode == "start_from_zero":
        offset = 1
    elif index_mode == "start_from_one":
        offset = 0
    else:
        offset = 1
        
    alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    colname = ""
    divend = colx + offset
    while divend > 0:
        modulo = (divend - 1) % 26
        colname = alphabet[modulo] + colname
        divend = (divend - modulo) // 26
    return colname

関数の使い方&テスト(docstring そのままですいません):

>>> colname(0)
'A'
>>> colname(25)
'Z'
>>> colname(25 + 1)
'AA'
>>> colname(26*26 + 25)
'ZZ'
>>> colname(1, "start_from_one")
'A'
>>> colname(26, "start_from_one")
'Z'
>>> colname(26 + 1, "start_from_one")
'AA'
>>> colname(26*26 + 26, "start_from_one")
'ZZ'

計算時間については、例えば"AA"だと2回whileループを回るだけです、"AAA"だと3回、"AAAAAAAAAA"だと10回です。これは10回の演算で26**10の大きさの列番号を10演算の計算で変換できるということですから、実用上十分すぎる速さです。通常の使用ではほぼ数演算のオーダーで変換できるでしょう。コードを見ると、これ以上シンプルにできないレベルですので、これがベストアンサーだと思います。数値をエクセルの列のアルファベットの形式に変換する場合は、こちらを使いましょう。

以上です。