ホンモノのエンジニアになりたい

ITやビジネス、テクノロジーの話を中心とした雑記ブログです。

【Python】 エクセル列のアルファベットと数字の変換

エクセル列のアルファベット数字変換のメモ。

Pythonのopenpyxlで遊んでいた時に、連続したセルの選択が[B1:B5]の形式でしかできないようだったので、(1,2)→B1、つまりは2→Bの変換が必要になりました。

目的

・数字を入力するとエクセル列のアルファベットを返す関数を作成する

1→A、2→B、3→C、・・・26→Z

27→AA、28→AB、29→AC、・・・52→AZ、

53→BA、・・・78→BZ、・・・702→ZZ

703→AAA、・・・1378→AZZ、

1379→BAA、・・・2054→BZZ、

2055→CAA、・・・・・・・18278→ZZZ

これぞ車輪の再発明(2018/12追記)

あ、、、あった
普通にあったでござる

ハァ━(-д-;)━ァ...

import openpyxl

wb = openpyxl.Workbook()
ws = wb.active

ws.cell(row=1,column=1000).column
# 'ALL'
# ってゆーかー
ws.cell(row=100,column=100).coordinate
# 'CV100'

作っちまったじゃまいか。 別にいいよね、アルゴリズム遊びにだって使えるし他の言語の人もいるだろうし。。。ね?

以下、Openpyxler以外の人々へ

2桁までの場合(A列~ZZ列)

2桁の場合はMicrosoft社が変換手順を公開しています。

https://support.microsoft.com/ja-jp/help/833402/how-to-convert-excel-column-numbers-into-alphabetical-characters

このURLから手順を引用したものが↓

1.列番号から 1 引いた数を 26 で割り、結果の整数値を変数 i に代入します。

2.列番号から i に 26 を掛けた数を引き、結果の整数値を変数 j に代入します。

3.整数値を対応する英文字に変換します。i および j は、それぞれ 0 ~ 9 および 1 ~ 26 の値になります。

つまり、こう。

#A列~ZZ列までの場合
def toAlpha2(num):
    i = int((num-1)/26)
    j = int(num-(i*26))
    Alpha = ''
    for z in i,j:
        if z != 0:
            Alpha += chr(z+64)
    return Alpha

toAlpha2(100)
#'CV'

引用文中3の「それぞれ0~9」というのは、恐らくエクセル2003の最大列数256列の話だと思われ。

3桁までの場合(A列~ZZZ列)

次は実際に今のエクセルの上限となる3桁の場合。エクセルは16,384列が最大なので実際はXFD列がMAX。

コード①

#A列~ZZZ列までの場合
def toAlpha31(num):
    h=int((num-1-26)/(26*26))
    i=int((num-1-(h*26*26))/26)
    j=num-(i*26)-(h*26*26)
    Alpha=''
    for k in h,i,j:
        if k!=0:
            Alpha+=chr(k+64)
    return Alpha

toAlpha31(1000)
#'ALL'

MS社が公開していた2桁パターンから拡張してことりあえず目的は達成できました。 ただホントに合ってるかと図に書いて考えてみたら、もう少しシンプルな計算ができそうだと書いてみたのが↓

コード②

#A列~ZZZ列までの場合 - その2
def toAlpha32(num):
    h=int((num-1-26)/(26*26))
    i=int((num-1)/26)-h*26
    j=num-(i*26)-(h*26*26)
    Alpha=''
    for k in h,i,j:
        if k!=0:
            Alpha+=chr(k+64)
    return Alpha

toAlpha32(1000)
#'ALL'

intが入った計算はわかりませんが、数学的には同じことを書いている気がする。

おわり