Day 33:Excel書式で「見やすい資料」をコードから作る
Day 33では、Excelの 書式設定 をPythonから操作して、 「ただのデータ」ではなく 人が見て分かりやすい資料 を自動生成することを目指します。
扱うキーワードは次の5つです。
- フォント
- 罫線
- 背景
- 表示形式
- 列幅
業務では「見た目が整っているかどうか」が意外なほど重要です。 Pythonで書式まで整えられるようになると、 「そのまま配布できるレベルのExcel」を自動で作れるようになっていきます。
書式設定の基本:openpyxlのスタイル機能
スタイルは「Cell」に対して設定する
Day 31・32で学んだ通り、openpyxl では セル(Cell) を通して値を読み書きします。 書式設定も同じく、セル単位で設定するのが基本です。
openpyxl には、書式設定用に次のようなクラスがあります。
Font(フォント)Border(罫線)Side(罫線の線種)PatternFill(背景色)Alignment(配置)NamedStyle(スタイルのテンプレート)- セルの
number_format(表示形式)
これらを組み合わせて、「見やすい表」を作っていきます。
まずはサンプル用のExcelを作り、その上に書式を乗せていく形で説明します。
サンプルデータの準備
# day33_setup.py
from openpyxl import Workbook
def create_sample_excel():
"""Day 33用のサンプルExcelファイルを作成する関数です。"""
wb = Workbook()
ws = wb.active
ws.title = "Sales"
# ヘッダー行
ws["A1"] = "商品名"
ws["B1"] = "数量"
ws["C1"] = "単価"
ws["D1"] = "売上"
# データ行
ws["A2"] = "りんご"; ws["B2"] = 10; ws["C2"] = 120; ws["D2"] = 1200
ws["A3"] = "みかん"; ws["B3"] = 8; ws["C3"] = 100; ws["D3"] = 800
ws["A4"] = "ぶどう"; ws["B4"] = 5; ws["C4"] = 300; ws["D4"] = 1500
wb.save("sales_style.xlsx")
print("sales_style.xlsx を作成しました。")
if __name__ == "__main__":
create_sample_excel()
Pythonこのファイルに対して、フォント・罫線・背景・表示形式・列幅を順番に設定していきます。
フォント:ヘッダーを太字・大きめにする
Fontクラスでフォントを指定する
from openpyxl import load_workbook
from openpyxl.styles import Font
def apply_font():
"""ヘッダー行にフォント書式を適用する例です。"""
wb = load_workbook("sales_style.xlsx")
ws = wb["Sales"]
# ヘッダー行(1行目)のセルに対してフォントを設定します。
header_font = Font(
name="Meiryo", # フォント名(日本語環境ならメイリオなど)
size=12, # フォントサイズ
bold=True, # 太字
color="000000" # 黒(RGB形式)
)
for cell in ws[1]: # 1行目の全セルをループします。
cell.font = header_font
wb.save("sales_style_font.xlsx")
print("sales_style_font.xlsx にフォント書式を適用しました。")
if __name__ == "__main__":
apply_font()
Pythonここでのポイントは、
Fontクラスでフォントのスタイルを定義していることws[1]で「1行目のセル一覧」を取得し、ループで一括適用していること- ヘッダーだけ太字・大きめにすることで、表がぐっと見やすくなること
です。
罫線:表らしく枠線をつける
BorderとSideで罫線を定義する
from openpyxl import load_workbook
from openpyxl.styles import Border, Side
def apply_border():
"""表全体に罫線を適用する例です。"""
wb = load_workbook("sales_style_font.xlsx")
ws = wb["Sales"]
# 罫線のスタイルを定義します。
thin = Side(border_style="thin", color="000000") # 細い線
border = Border(
top=thin,
bottom=thin,
left=thin,
right=thin
)
# A1:D4 の範囲に罫線を適用します。
for row in ws["A1:D4"]:
for cell in row:
cell.border = border
wb.save("sales_style_border.xlsx")
print("sales_style_border.xlsx に罫線を適用しました。")
if __name__ == "__main__":
apply_border()
Pythonここでのポイントは、
Sideで線の種類(thinなど)と色を指定していることBorderで上下左右の線をまとめて定義していること- 範囲指定(
ws["A1:D4"])で表全体に罫線を一括適用していること
です。
背景:ヘッダー行に色をつける
PatternFillで背景色を設定する
from openpyxl import load_workbook
from openpyxl.styles import PatternFill
def apply_header_background():
"""ヘッダー行に背景色をつける例です。"""
wb = load_workbook("sales_style_border.xlsx")
ws = wb["Sales"]
# 背景色のスタイルを定義します。
header_fill = PatternFill(
fill_type="solid", # 塗りつぶし
fgColor="CCE5FF" # 薄い青(RGB形式)
)
# 1行目のセルに背景色を適用します。
for cell in ws[1]:
cell.fill = header_fill
wb.save("sales_style_background.xlsx")
print("sales_style_background.xlsx にヘッダー背景色を適用しました。")
if __name__ == "__main__":
apply_header_background()
Pythonここでのポイントは、
PatternFillで塗りつぶしの背景色を指定していること- ヘッダー行だけ色をつけることで、「見出し」が視覚的に分かりやすくなること
です。
表示形式:数値を「通貨」「カンマ区切り」で表示する
number_formatで表示形式を指定する
Excelでは、セルの値は同じでも「表示形式」によって見え方が変わります。 たとえば、売上を「カンマ区切りの通貨形式」で表示することができます。
from openpyxl import load_workbook
def apply_number_format():
"""単価・売上に表示形式を適用する例です。"""
wb = load_workbook("sales_style_background.xlsx")
ws = wb["Sales"]
# C列(単価)とD列(売上)に対して表示形式を設定します。
for row in range(2, 5): # 2〜4行目
unit_price_cell = ws.cell(row=row, column=3) # C列
sales_cell = ws.cell(row=row, column=4) # D列
# 通貨っぽい表示形式(例: 1,200)
unit_price_cell.number_format = "#,##0"
sales_cell.number_format = "#,##0"
wb.save("sales_style_number_format.xlsx")
print("sales_style_number_format.xlsx に表示形式を適用しました。")
if __name__ == "__main__":
apply_number_format()
Pythonここでのポイントは、
number_formatにExcelの表示形式文字列を設定していること- 実際の値は数値のまま保持されるため、後から計算も可能なこと
- 見た目だけを整えることで、資料としての読みやすさが向上すること
です。
列幅:内容に合わせて自動調整する
列幅を手動で設定する
from openpyxl import load_workbook
def apply_column_width():
"""列幅を調整する例です。"""
wb = load_workbook("sales_style_number_format.xlsx")
ws = wb["Sales"]
# 列幅を設定します。
ws.column_dimensions["A"].width = 15 # 商品名
ws.column_dimensions["B"].width = 8 # 数量
ws.column_dimensions["C"].width = 10 # 単価
ws.column_dimensions["D"].width = 12 # 売上
wb.save("sales_style_column_width.xlsx")
print("sales_style_column_width.xlsx に列幅を適用しました。")
if __name__ == "__main__":
apply_column_width()
Pythonここでのポイントは、
ws.column_dimensions["列記号"].widthで列幅を指定していること- 列幅を調整することで、文字が途中で切れずに表示されるようになること
です。
まとめて書式を適用するテンプレート
最後に、Day 33で学んだ書式設定を一気に適用するテンプレートを示します。
# day33_excel_style.py
from openpyxl import Workbook, load_workbook
from openpyxl.styles import Font, Border, Side, PatternFill
def setup():
wb = Workbook()
ws = wb.active
ws.title = "Sales"
ws["A1"] = "商品名"
ws["B1"] = "数量"
ws["C1"] = "単価"
ws["D1"] = "売上"
ws["A2"] = "りんご"; ws["B2"] = 10; ws["C2"] = 120; ws["D2"] = 1200
ws["A3"] = "みかん"; ws["B3"] = 8; ws["C3"] = 100; ws["D3"] = 800
ws["A4"] = "ぶどう"; ws["B4"] = 5; ws["C4"] = 300; ws["D4"] = 1500
wb.save("sales_style_all.xlsx")
print("sales_style_all.xlsx を作成しました。")
def apply_styles():
wb = load_workbook("sales_style_all.xlsx")
ws = wb["Sales"]
# フォント(ヘッダー)
header_font = Font(name="Meiryo", size=12, bold=True, color="000000")
for cell in ws[1]:
cell.font = header_font
# 罫線(表全体)
thin = Side(border_style="thin", color="000000")
border = Border(top=thin, bottom=thin, left=thin, right=thin)
for row in ws["A1:D4"]:
for cell in row:
cell.border = border
# 背景色(ヘッダー)
header_fill = PatternFill(fill_type="solid", fgColor="CCE5FF")
for cell in ws[1]:
cell.fill = header_fill
# 表示形式(単価・売上)
for row in range(2, 5):
ws.cell(row=row, column=3).number_format = "#,##0"
ws.cell(row=row, column=4).number_format = "#,##0"
# 列幅
ws.column_dimensions["A"].width = 15
ws.column_dimensions["B"].width = 8
ws.column_dimensions["C"].width = 10
ws.column_dimensions["D"].width = 12
wb.save("sales_style_all_done.xlsx")
print("sales_style_all_done.xlsx に書式を一括適用しました。")
def main():
setup()
apply_styles()
if __name__ == "__main__":
main()
Pythonこのスクリプトを実行すると、
- サンプルデータ入りの
sales_style_all.xlsxを作成し - フォント・罫線・背景・表示形式・列幅を一括で適用した
sales_style_all_done.xlsxを生成します。
Day 33のまとめ
Day 33では、Excel書式として、
- フォント(Font)でヘッダーを太字・大きめにして、見出しを強調する方法
- 罫線(Border・Side)で表全体に枠線をつけて、資料としての体裁を整える方法
- 背景(PatternFill)でヘッダー行に色をつけて、視覚的な区切りを作る方法
- 表示形式(number_format)で数値を「カンマ区切り」などの読みやすい形にする方法
- 列幅(column_dimensions)で内容に合わせて列の幅を調整する方法
をステップバイステップで体験していただきました。
ここまで来ると、Pythonで「ただのデータ」を扱うだけでなく、 「そのまま人に渡せるレベルのExcel資料」を自動生成する ところまで視野に入ってきます。 次のDayでは、この書式設定を業務自動化のシナリオに組み込んで、 より実務に近い形で活用していきます。
