基礎から学ぶPython入門 90日コース | 業務自動化 - Day 33:Excel書式

Python 90日で身につけるPython
スポンサーリンク
スポンサーリンク

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

このスクリプトを実行すると、

  1. サンプルデータ入りの sales_style_all.xlsx を作成し
  2. フォント・罫線・背景・表示形式・列幅を一括で適用した sales_style_all_done.xlsx を生成します。

Day 33のまとめ

Day 33では、Excel書式として、

  • フォント(Font)でヘッダーを太字・大きめにして、見出しを強調する方法
  • 罫線(Border・Side)で表全体に枠線をつけて、資料としての体裁を整える方法
  • 背景(PatternFill)でヘッダー行に色をつけて、視覚的な区切りを作る方法
  • 表示形式(number_format)で数値を「カンマ区切り」などの読みやすい形にする方法
  • 列幅(column_dimensions)で内容に合わせて列の幅を調整する方法

をステップバイステップで体験していただきました。

ここまで来ると、Pythonで「ただのデータ」を扱うだけでなく、 「そのまま人に渡せるレベルのExcel資料」を自動生成する ところまで視野に入ってきます。 次のDayでは、この書式設定を業務自動化のシナリオに組み込んで、 より実務に近い形で活用していきます。

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