PythonでExcel自動操作:一覧データに新しい行を差し込む

やりたいこと

今回使うExcelは、Jリーグデータサイトから抽出した得点ランキングのデータと、

架空の選手露舞尊選手のデータ。

大会、順位、選手名、所属、得点数、シュート数、出場数、出場時間、1試合平均の得点数が項目として存在する。

この一覧データに、得点数50の露舞尊選手のデータを差し込みたい。

ただ後ろに追加するだけでなく、得点数50のあたりに差し込みたい。

考え方

普段Excelで操作している感覚だとだいたい以下の感覚で差し込みを行うものと思われる。

①一覧データの得点数を上から順に見ていき、得点数が同じ行を見つける
②差し込み行を台帳に挿入する

上記の考え方をそのまま実装してもよさそうではあるが、forとifをけっこうネストしないといけなさそうで面倒に思われるので、以下の手順で実現することにする。

①一覧データと差し込み用データの辞書リストを作成する

②①で作成した辞書リストを単純結合する

③結合した一覧データを得点数で再ソートする

辞書データの作成の考え方は↓より。

PythonでExcel自動操作 辞書リスト格納の考え方 | 草通り越して徒然草www (ssk0822.jp)

実装

構成フォルダは以下の通り。indataフォルダにインプットのファイルを格納し、prgフォルダで実行、outdataに出力する。

workfolder
├indata
├outdata
└prg

import openpyxl
from operator import itemgetter

#1.辞書リストの作成
#もとリストの読み込み
wb = openpyxl.load_workbook(r"../indata/全選手_得点データ.xlsx")
sh = wb.active

def make_shipment(sh):
    shipment_list = []
    for row in sh.iter_rows():
        if row[0].row == 1:
            header_cells = row
        else:
            row_dic = {}
            for v, k in zip(header_cells, row):
                row_dic[v.value] = k.value
            shipment_list.append(row_dic)
    return shipment_list

shipment_list_a = make_shipment(sh)

#差し込み用リスト
wb = openpyxl.load_workbook(r"../indata/露舞尊_得点データ.xlsx")
sh = wb.active
shipment_list_b = make_shipment(sh)

#2.リストの結合
shipment_list_b.extend(shipment_list_a)

#3.得点数で再ソート
sorted_list = sorted(shipment_list_b, key = itemgetter("得点"), reverse=True)

#転記準備
owb = openpyxl.Workbook()
osh = owb.active
list_row = 1

#転記先ヘッダ処理
osh.cell(list_row,1).value = "大会"
osh.cell(list_row,2).value = "順位"
osh.cell(list_row,3).value = "選手名"
osh.cell(list_row,4).value = "所属(J最終所属)"
osh.cell(list_row,5).value = "得点"
osh.cell(list_row,6).value = "シュート"
osh.cell(list_row,7).value = "出場"
osh.cell(list_row,8).value = "出場時間"
osh.cell(list_row,9).value = "1試合平均"

#転記処理
for dic in sorted_list:
    list_row += 1
    osh.cell(list_row,1).value = dic["大会"]
    osh.cell(list_row,2).value = dic["順位"]
    osh.cell(list_row,3).value = dic["選手名"]
    osh.cell(list_row,4).value = dic["所属(J最終所属)"]
    osh.cell(list_row,5).value = dic["得点"]
    osh.cell(list_row,6).value = dic["シュート"]
    osh.cell(list_row,7).value = dic["出場"]
    osh.cell(list_row,8).value = dic["出場時間"]
    osh.cell(list_row,9).value = dic["1試合平均"]

owb.save(r"../outdata/全選手_得点データ_露舞尊.xlsx")

出力したデータは以下の通り。無事露舞尊選手のデータが得点50の位置に差し込まれた。

次回やること

差し込んだ行を踏まえて、一覧リストに得点ランクを再付与する。

以上

タイトルとURLをコピーしました