Excelの列幅調整を自動化!openpyxlで複数列の幅を一括で設定するテクニック

openpyxl

PythonでExcelレポートを自動生成!…ここまでは順調でも、出力されたファイルを開いてみると、列幅が足りずにデータが隠れていたり、逆に広すぎて不格好だったり。結局、手作業で一つずつ列幅を調整する羽目になっていませんか?

それでは自動化のメリットが半減してしまいます。

この記事では、openpyxlライブラリを使い、面倒な複数列の幅調整をプログラムで一括処理するための、実用的なテクニックを3つのレベルに分けて解説します。もう、レポート生成後に手動で列幅を直す作業は必要ありません。

列幅操作の基本:ColumnDimensionとは?

まず、すべてのテクニックの基礎となるColumnDimensionオブジェクトについて簡単に復習しましょう。

ColumnDimensionは、特定の列が持つ「幅」などの書式情報を管理するオブジェクトです。ワークシートのcolumn_dimensions属性から、‘A’や’B’といった列のアルファベット(列レター) をキーとして取得します。

from openpyxl import Workbook

wb = Workbook()
ws = wb.active

# 'A'列の幅を15に設定する基本形
ws.column_dimensions['A'].width = 15

この基本操作をループと組み合わせることで、強力な一括設定が実現します。

テクニック1:連続した複数列の幅を統一する

最もシンプルでよく使うのが、指定した範囲の列をすべて同じ幅に設定するテクニックです。

forループと列レターのリストを組み合わせることで、複数の列に同じ設定を簡単に適用できます。

from openpyxl import Workbook
import string # アルファベットを扱うためにインポート

wb = Workbook()
ws = wb.active
ws.title = "一括設定(統一幅)"

# ダミーデータを追加
ws.append(["日付", "担当者", "商品コード", "商品名", "数量", "単価"])

# C列からF列までの幅をすべて20に設定したい場合
target_cols = ['C', 'D', 'E', 'F']
for col_letter in target_cols:
    ws.column_dimensions[col_letter].width = 20

# A列(日付)とB列(担当者)は個別に設定
ws.column_dimensions['A'].width = 12
ws.column_dimensions['B'].width = 15

wb.save("bulk_uniform_width.xlsx")

このように、変更したい列レターのリストを用意し、ループ処理を行うだけで、一括設定が完了します。

テクニック2:列ごとに異なる幅を一括で設定する

次に、列ごとに異なる幅をまとめて設定する、より柔軟なテクニックです。

辞書(dictionary)を使って「列レター」と「設定したい幅」のペアを定義し、それをループで処理します。 これにより、各列の特性に合わせた幅を一度の処理で設定できます。

from openpyxl import Workbook

wb = Workbook()
ws = wb.active
ws.title = "一括設定(個別幅)"

ws.append(["ID", "商品名", "商品説明", "登録日時"])

# 列レターをキー、幅を値とする辞書を定義
width_settings = {
    'A': 8,   # ID
    'B': 30,  # 商品名
    'C': 50,  # 商品説明
    'D': 20   # 登録日時
}

# 辞書をループして、キー(列レター)と値(幅)を一度に設定
for col_letter, width in width_settings.items():
    ws.column_dimensions[col_letter].width = width
    print(f"{col_letter}列の幅を {width} に設定しました。")

wb.save("bulk_custom_width.xlsx")

この方法は、設定内容をコードの冒頭(辞書の定義部分)で一元管理できるため、後からのメンテナンスも非常に楽になります。

究極の自動化:全列の幅を内容に合わせて一括調整(オートフィット)

最後に、データの内容に応じて最適な幅を自動計算し、すべての列に一括で適用する究極のテクニックです。

openpyxlには直接のautofit機能はありませんが、各列の最大文字数を計算することで、完璧な自動調整を実装できます。

この処理は、まさに「複数列の一括設定」の集大成です。

# ... ワークシートとデータ準備は省略 ...
data = [
    ["名前", "メールアドレス", "備考"],
    ["田中 太郎", "taro.tanaka@example.com", "初回購入"],
    ["鈴木 一郎", "ichiro.suzuki@long-domain-name-example.co.jp", "重要な顧客。次回提案の予定あり。"],
    ["佐藤 花子", "hanako.sato@example.com", ""]
]
for row in data:
    ws.append(row)

# 1. まず、各列の最大文字数を計算して辞書に保存する
column_widths = {}
for row in ws.rows:
    for cell in row:
        column_letter = cell.column_letter
        # 現在の文字長と、記録されている最大長を比較
        current_length = len(str(cell.value))
        if column_letter not in column_widths or current_length > column_widths[column_letter]:
            column_widths[column_letter] = current_length

# 2. 計算した最大文字数に基づいて、全列の幅を一括で設定する
for col_letter, width in column_widths.items():
    # 少し余裕を持たせる(+2)と見栄えが良い
    ws.column_dimensions[col_letter].width = width + 2

wb.save("bulk_autofit_width.xlsx")

このスクリプトを実行すれば、どんなデータが入ってきても、常に最適な列幅のExcelファイルが自動で生成されます。

押さえておきたいポイント

  • アクセスは「列レター」で: ColumnDimensionを操作する際は、ws.column_dimensions['A']のように、数値ではなく必ずアルファベットの列レターで指定します。
  • 行の高さはRowDimension: 行の高さを扱いたい場合は、RowDimensionオブジェクトを使います。こちらはws.row_dimensions[1]のように数値で指定します。

まとめ:列幅調整の自動化でレポート作成を効率化しよう

今回は、openpyxlを使って複数の列幅を一括で設定するための3つの実践的なテクニックを紹介しました。

  1. 統一幅: forループで連続した列に同じ幅を設定する。
  2. 個別幅: 辞書を活用して、列ごとに異なる幅をまとめて設定する。
  3. 自動調整: 全セルの内容から最適な幅を計算し、一括で適用する。

これらのテクニックを身につけることで、PythonによるExcel操作は次のレベルへと到達します。単なるデータ出力で終わらせず、誰もが見やすい、完成されたレポートの自動生成を目指しましょう。

コメント

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