Pythonで自動生成したExcelレポート、データは正しいのに、なぜか見づらい…。その原因の一つは、行の高さがバラバラで、体裁が整っていないからかもしれません。
手作業で一行ずつ高さを調整するのは、まさに時間の無駄です。
この記事では、openpyxlライブラリのRowDimensionを使い、面倒なExcelの行の高さ調整をPythonで自動化し、複数行をまとめて変更するテクニックを解説します。もう、レポート生成後に手直しする必要はありません。
RowDimensionとは? Excel行の高さを操る司令塔
まず、RowDimensionが何者なのかを簡単に理解しましょう。
RowDimensionは、Excelの特定の行が持つ「高さ」や「表示/非表示」といった書式情報を管理するオブジェクトです。
このオブジェクトは、ワークシートが持つrow_dimensionsという特別な辞書から、行番号を指定して取得します。
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
# 2行目のRowDimensionオブジェクトを取得
# これを操作することで2行目の高さなどを変更できる
row_dim_2 = ws.row_dimensions[2] このrow_dimensionsを使いこなすことが、行の見た目を自動で整える鍵となります。
基本の1行:特定の行の高さを変更する
まずは基本として、特定の1行だけの高さを変更する方法を見てみましょう。これが一括変更の基礎となります。
行の高さを変更するには、RowDimensionオブジェクトの.heightプロパティに数値を代入します。
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
ws.title = "高さ変更の基本"
ws.append(["氏名", "部署", "役職"]) # 1行目
ws.append(["山田 太郎", "営業部", "課長"]) # 2行目
# 1行目(見出し行)の高さを30ポイントに設定
ws.row_dimensions[1].height = 30
wb.save("single_row_height.xlsx")このコードを実行すると、single_row_height.xlsxというファイルが作成され、1行目だけが高くなっていることが確認できます。
本題:複数行の高さを「一括変更」するテクニック
ここからが本題です。forループを使うことで、複数行の高さを効率的に一括変更できます。
方法1:連続した行の高さをまとめて変更する
range()関数とforループを組み合わせることで、指定した範囲の行の高さを一様に設定できます。 レポートの全データ行の高さを揃えたい場合に非常に有効です。
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
ws.title = "一括変更サンプル"
# ダミーデータを20行追加
ws.append(["見出し1", "見出し2", "見出し3"])
for i in range(20):
ws.append([f"データ{i+1}-A", f"データ{i+1}-B", f"データ{i+1}-C"])
# 2行目から21行目までの全データ行の高さを25に統一
for i in range(2, 22):
ws.row_dimensions[i].height = 25
# 見出し行(1行目)は別に高さを設定
ws.row_dimensions[1].height = 40
wb.save("bulk_row_height.xlsx")このコードは、見出し行を高く、データ行を均一の高さに設定する、という実用的なレポートフォーマットを自動で作成します。
方法2:条件に応じて行の高さを変更する
さらに一歩進んだ自動化として、特定の条件に一致する行だけ高さを変えるという処理も可能です。例えば、小計や合計が記載された行を目立たせるために、その行だけ高くすることができます。
# ... データ準備は省略 ...
ws.append(["りんご", 100])
ws.append(["みかん", 200])
ws.append(["小計", 300]) # この行を高くしたい
ws.append(["ぶどう", 150])
ws.append(["メロン", 500])
ws.append(["合計", 950]) # この行を高くしたい
# 全ての行をチェック
# enumerateを使うと行番号も同時に取得できる(start=1で1から開始)
for i, row in enumerate(ws.rows, start=1):
# A列のセルの値を取得
cell_value = row[0].value
# A列に"計"という文字が含まれていたら、その行の高さを35にする
if "計" in str(cell_value):
print(f"{i}行目({cell_value})の高さを変更します。")
ws.row_dimensions[i].height = 35
wb.save("conditional_row_height.xlsx")このように、データの内容に応じて動的に書式を適用することで、手作業では到底できないレベルの効率的なレポート生成が実現します。
補足:行の非表示も自動化できる
RowDimensionは高さだけでなく、行の表示・非表示も制御できます。.hiddenプロパティをTrue`に設定すると、その行を非表示にできます。
これもループと組み合わせることで、「特定のステータスの行をすべて非表示にする」といった処理を自動化できます。
# 5行目を非表示にする
ws.row_dimensions[5].hidden = True押さえておきたい注意点
最後に、RowDimensionを使う上での重要なポイントです。
- 行番号は
1から始まる: Pythonのリストなどとは異なり、openpyxlの行・列番号はExcelの表示に合わせて1から始まります。ws.row_dimensions[0]とするとエラーになるため、注意してください。 - 列幅は
ColumnDimension: 行の高さを扱うのがRowDimensionであるのに対し、列の幅を扱うのはColumnDimensionです。こちらはws.column_dimensions['A'].widthのようにアルファベットで指定します。
まとめ:手作業の高さ調整から卒業しよう
今回は、openpyxlのRowDimensionを使って、Excelの行の高さを自動で、しかも一括で変更する方法を解説しました。
- 基本:
ws.row_dimensions[行番号].height = 数値で高さを設定。 - 一括変更:
forループと組み合わせることで、連続した行や条件に合う行の高さをまとめて変更できる。 - 自動化の真価: データの内容に応じて書式を動的に変えることで、真のレポート作成自動化が実現する。
このテクニックを身につければ、あなたのPythonスクリプトは単にデータを書き出すだけでなく、美しく整形された、すぐに使えるレポートを生成する強力なツールへと進化します。面倒な手作業の調整は、今日で終わりにしましょう。


コメント