全体まとめページは↓より。
やりたいこと
・以下のようなデータだけが入っている素ファイルを読み込み、体裁を整えて出力する。
・全体のフォントは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)
出力結果
出力ファイルの表が、要件を満たした体裁になっている。
以上