全体まとめページは↓より。
やりたいこと
・読み込みファイルから表データを転記し、表領域全体に罫線を引く
フォルダ構成
VSCodeで実行するときはprg配下を開いてpyファイルを作り実行する。
実装
import os
import openpyxl
from openpyxl.styles import Side
from openpyxl.styles import Border
#辞書リストの作成関数
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 = "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["使用回数"]
#罫線スタイルのオブジェクトを生成
thin = Side(border_style="thin", color="000000")
double = Side(border_style="double", color="000000")
red = Side(border_style="thin", color="ff0000")
gray = Side(border_style="thin", color="808080")
red_bold = Side(border_style="thick", color="ff0000")
#ヘッダ行のセルの値がNullになるまで罫線を引いていく
col = 1
while(osh.cell(1,col).value is not None):
osh.cell(1,col).border = Border(top=thin, left=thin, right=thin, bottom=thin)
col += 1
header_col_n = col #ヘッダの項目数を控える
#A列がインデックス列である前提で、セルの値がNullになるまで罫線を引いていく
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(top=thin, left=thin, right=thin, bottom=thin)
row += 1
#出力ファイルを保存
owb.save(outfile_path)
####失敗
##A列がインデックス列である前提で、セルの値がNullになるまで罫線を引いていく
##列方向のNull判定を行方向のNull判定にネストしてすべての行列に処理をする
#col = 1
#row = 1
#while(osh.cell(row,1).value is not None):
# col = 1
# while(osh.cell(row,col).value is not None):
# osh.cell(row,col).border = Border(top=thin, left=thin, right=thin, bottom=thin)
# col += 1
# row += 1
出力結果
表領域全体に罫線が引かれている。
ちなみに(失敗)
ヘッダ行処理と同じように各行でcolのNull判定で処理を止めるようにすると、欠損値にぶつかった瞬間にその行で処理が止まってしまう。
###失敗
#A列がインデックス列である前提で、セルの値がNullになるまで罫線を引いていく
#列方向のNull判定を行方向のNull判定にネストしてすべての行列に処理をする
col = 1
row = 1
while(osh.cell(row,1).value is not None):
col = 1
while(osh.cell(row,col).value is not None):
osh.cell(row,col).border = Border(top=thin, left=thin, right=thin, bottom=thin)
col += 1
row += 1
また、forを素直にfor col in range(header_col_n)とすると、最初のセル番地指定が0列目となりエラーになるので注意する。
ValueError: Row or column values must be at least 1
以上