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つの実践的なテクニックを紹介しました。
- 統一幅:
forループで連続した列に同じ幅を設定する。 - 個別幅: 辞書を活用して、列ごとに異なる幅をまとめて設定する。
- 自動調整: 全セルの内容から最適な幅を計算し、一括で適用する。
これらのテクニックを身につけることで、PythonによるExcel操作は次のレベルへと到達します。単なるデータ出力で終わらせず、誰もが見やすい、完成されたレポートの自動生成を目指しましょう。


コメント