PythonでExcel操作:項目が多いデータの転記をラクにする

Excel操作自動化

全体まとめページは↓より。

やりたいこと

項目が多い(横に長い)データを扱うとき、冗長になる転記処理をラクにする。

フォルダ構成

VSCodeで実行するときはprg配下を開いてpyファイルを作り実行する。

実装(冗長でしんどい)

項目ごとに1行ずつ明示的に記載する方法。項目が増えるほどヘッダとデータ部分でそれぞれコードが長くなってしまう。

import os
import openpyxl

#辞書リストの作成関数
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

#ファイル名を入力させる
print("ファイル名を入力:")
filename = input()

#読み込みファイルパスを作成
infile_path = os.path.join("..\indata" , filename)

#出力ファイルパスを作成
outfile_path = os.path.join("..\outdata" , filename)

#読み込みファイルからオブジェクトを生成
iwb = openpyxl.load_workbook(infile_path)
ish = iwb.active

#出力ファイルのオブジェクトを生成
owb = openpyxl.Workbook()
osh = owb.active

#辞書リストを作成
shipment_list = make_shipment(ish)

#転記先ヘッダ処理
list_row = 1
osh.cell(list_row,1).value = "index"
osh.cell(list_row,2).value = "北海道"
osh.cell(list_row,3).value = "青森"
osh.cell(list_row,4).value = "秋田"
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 = "群馬"
osh.cell(list_row,10).value = "栃木"
osh.cell(list_row,11).value = "茨城"
osh.cell(list_row,12).value = "東京"
osh.cell(list_row,13).value = "千葉"
osh.cell(list_row,14).value = "埼玉"
osh.cell(list_row,15).value = "神奈川"

#転記処理
for dic in shipment_list:
    list_row += 1
    osh.cell(list_row,1).value = dic["index"]
    osh.cell(list_row,2).value = dic["北海道"]
    osh.cell(list_row,3).value = dic["青森"]
    osh.cell(list_row,4).value = dic["秋田"]
    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["群馬"]
    osh.cell(list_row,10).value = dic["栃木"]
    osh.cell(list_row,11).value = dic["茨城"]
    osh.cell(list_row,12).value = dic["東京"]
    osh.cell(list_row,13).value = dic["千葉"]
    osh.cell(list_row,14).value = dic["埼玉"]
    osh.cell(list_row,15).value = dic["神奈川"]
    
#出力ファイルを保存
owb.save(outfile_path)

実装(少しだけラクになる)

★部分が今回のポイント。項目リストを先に定義して、転記処理はforで回すことで転記処理部分を簡潔にできる。

import os
import openpyxl

#辞書リストの作成関数
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

#★項目リスト
collist = ["index","北海道","青森","秋田","岩手","宮城","山形","福島"
           ,"群馬","栃木","茨城","東京","千葉","埼玉","神奈川"]

#ファイル名を入力させる
print("ファイル名を入力:")
filename = input()

#読み込みファイルパスを作成
infile_path = os.path.join("..\indata" , filename)

#出力ファイルパスを作成
outfile_path = os.path.join("..\outdata" , filename)

#読み込みファイルからオブジェクトを生成
iwb = openpyxl.load_workbook(infile_path)
ish = iwb.active

#出力ファイルのオブジェクトを生成
owb = openpyxl.Workbook()
osh = owb.active

#辞書リストを作成
shipment_list = make_shipment(ish)

#★転記先ヘッダ処理
for col in range(len(collist)):
    osh.cell(1,col+1).value = collist[col]

#★転記処理
list_row = 1
for dic in shipment_list:
    list_row += 1
    for col in range(len(collist)):
        colname = collist[col]
        osh.cell(list_row,col+1).value = dic[colname]
        col += 1

#出力ファイルを保存
owb.save(outfile_path)

出力結果

読み込みファイルと同様のデータが出力される。

以上

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