PythonでExcel操作:【総合】素ファイルを読み込んで表としての体裁を整える

勉強系(Python/Excel/統計学/その他)

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

やりたいこと

・以下のようなデータだけが入っている素ファイルを読み込み、体裁を整えて出力する。

・全体のフォントはMeiryo UIで統一する
・ヘッダ行は薄い青で塗りつぶし、太字ににして下二重罫線を引く
・データ行は塗りつぶしや太字にはせず、下罫線のみ引く
・「日付」列と「挨拶」列は幅を広めにとる

フォルダ構成

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

実装

import os
import openpyxl
from openpyxl import utils
from datetime import datetime, date
from openpyxl.styles import PatternFill
from openpyxl.styles import Side
from openpyxl.styles import Border
from openpyxl.styles import Font
from openpyxl import utils

#辞書リストの作成関数
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
for dic in shipment_list:
    list_row += 1
    dic["日付"] = utils.datetime.from_excel(dic["日付"])
    dic["日付"] = date(dic["日付"].year, dic["日付"].month, dic["日付"].day)


#転記先ヘッダ処理
list_row = 1
osh.cell(list_row,1).value = "No."
osh.cell(list_row,2).value = "日付"
osh.cell(list_row,3).value = "挨拶"
osh.cell(list_row,4).value = "使用回数"

#転記処理
for dic in shipment_list:
    list_row += 1
    osh.cell(list_row,1).value = dic["No."]
    osh.cell(list_row,2).value = dic["日付"]
    osh.cell(list_row,3).value = dic["挨拶"]
    osh.cell(list_row,4).value = dic["使用回数"]

#★ここから表の体裁を整える処理
#セルの幅を調整
osh.column_dimensions["B"].width = 15
osh.column_dimensions["C"].width = 30

#塗りつぶしのオブジェクトを生成
fill = PatternFill(patternType="solid", fgColor="00E0FFFF")

#罫線スタイルのオブジェクトを生成
thin = Side(border_style="thin", color="000000")
double = Side(border_style="double", color="000000")

#フォントスタイルのオブジェクトを生成
font_MeiryoUI = Font(name='Meiryo UI')
font_bold_MeiryoUI = Font(name='Meiryo UI', bold=True)

#★ヘッダ部分のスタイル適用
#セルの値がNullになるまでセルに色を塗りつぶしていき、
#セル下部に二重線を引く
#フォントはMeiryo UIの太字を適用する
list_row = 1
col = 1
while(osh.cell(list_row,col).value is not None):
    osh.cell(list_row,col).fill = fill
    osh.cell(list_row,col).border = Border(bottom=double)
    osh.cell(list_row,col).font = font_bold_MeiryoUI
    col += 1
header_col_n = col #ヘッダの項目数を控える

#A列がインデックス列である前提で、セルの値がNullになるまで罫線を引いていく
#フォントはMeiryo UIを適用する
row = 2
while(osh.cell(row,1).value is not None):
    for col in ( n+1 for n in range(header_col_n-1)):
        osh.cell(row,col).border = Border(bottom=thin)
        osh.cell(row,col).font = font_MeiryoUI
    row += 1

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

出力結果

出力ファイルの表が、要件を満たした体裁になっている。

以上

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