PythonのopenpyxlでExcelの行と列を入れ替えてみた

今回のPythonの勉強は、Excelの行と列を入れ替えることをしてみました。

予め、都道府県とその都道府県庁所在地をリスト化したExceを用意し、そのリストの行と列を入れ替えたものを新しい別のシートに作成するというもの。
以下がExcelファイル「Example.xlsx」の中身。

Pythonのコードは以下の通り。
解説はコード内にコメントしてあります。

#openpyxlモジュールを使用する
import openpyxl

#既存のExcelファイルを開く
wb=openpyxl.load_workbook('Example.xlsx')
#既存ファイルのシートを指定
sheet1=wb['Sheet1']
#既存ファイルに新規シートをシート名と位置を指定して作成
sheet2=wb.create_sheet(title='Sheet2',index=1)

#Sheet1の値のある行数を取得
rw=sheet1.max_row
#Sheet1の値のある列数を取得
cl=sheet1.max_column

#iは値のある行数分繰り返す
#jは値のある列数分繰り返す
#range(start,stop)はstart≦i<stopでstopで指定した値は含まないので「+1」している
for i in range(1,rw+1):
    for j in range(1,cl+1):
        C1=sheet1.cell(row=i,column=j) #sheet1のセルの行番号と列番号を指定している
        C2=sheet2.cell(row=j,column=i) #sheet1のセルの行番号と列番号を入れ替えてsheet2のセルを指定している
        C2.value=C1.value #sheet2のセルにsheet1のセルの値を代入

wb.save('Example.xlsx') #上書き保存

結果は以下の通り。

最初のリストの行数は6、列数は2。つまり、

rw=sheet1.max_row=6
cl=sheet1.max_column=2

for文は、

for i in range(1,7): #1≦i<7、つまり1行目から6行目まで
    for j in range(1,3): #1≦i<3、つまり1列目から2列目まで

で、i=1のとき、j=1とj=2を行います。
つまり、sheet1のA1セルの値をsheet2のA1セルに代入し、続けてsheet1のB1セルの値をsheet2のA2セルに代入しています。

i=1でj=1のとき
        C1=sheet1.cell(row=1,column=1) #行番号1、列番号1、つまりA1
        C2=sheet2.cell(row=1,column=1) #行番号1、列番号1、つまりA1

i=1でj=2のとき
        C1=sheet1.cell(row=1,column=2) #行番号1、列番号2、つまりB1
        C2=sheet2.cell(row=2,column=1) #行番号2、列番号1、つまりA2

j=2が終わるとi=2のときになり、j=1とj=2を行います。
つまり、sheet1のA2セルの値をsheet2のB1セルに代入し、続けてsheet1のB2セルの値をsheet2のB2セルに代入しています。

i=2でj=1のとき
        C1=sheet1.cell(row=2,column=1) #行番号2、列番号1、つまりA2
        C2=sheet2.cell(row=1,column=2) #行番号1、列番号2、つまりB1

i=2でj=2のとき
        C1=sheet1.cell(row=2,column=2) #行番号2、列番号2、つまりB2
        C2=sheet2.cell(row=2,column=2) #行番号2、列番号2、つまりB2

j=2が終わるとi=3のときになり、j=1とj=2を行います。
つまり、sheet1のA3セルの値をsheet2のC1セルに代入し、続けてsheet1のB3セルの値をsheet2のC2セルに代入しています。

i=3でj=1のとき
        C1=sheet1.cell(row=3,column=1) #行番号3、列番号1、つまりA3
        C2=sheet2.cell(row=1,column=3) #行番号1、列番号3、つまりC1

i=3でj=2のとき
        C1=sheet1.cell(row=3,column=2) #行番号3、列番号2、つまりB3
        C2=sheet2.cell(row=2,column=3) #行番号2、列番号3、つまりC2

(以下略)

というように行と列が入れ替わります。










コメント

よく読まれている記事

CSSボタンでテキストを天地中央に揃えるとき、なぜボタン高と行高を一緒にするのか

FullCalendarの導入からカレンダー毎の色指定まで

FacebookページのフィードURLを取得しウォールを自サイトに表示