Excelの行操作を自動化!openpyxl.RowDimensionで高さを一括変更

openpyxl

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のようにアルファベットで指定します。

まとめ:手作業の高さ調整から卒業しよう

今回は、openpyxlRowDimensionを使って、Excelの行の高さを自動で、しかも一括で変更する方法を解説しました。

  • 基本: ws.row_dimensions[行番号].height = 数値 で高さを設定。
  • 一括変更: forループと組み合わせることで、連続した行や条件に合う行の高さをまとめて変更できる。
  • 自動化の真価: データの内容に応じて書式を動的に変えることで、真のレポート作成自動化が実現する。

このテクニックを身につければ、あなたのPythonスクリプトは単にデータを書き出すだけでなく、美しく整形された、すぐに使えるレポートを生成する強力なツールへと進化します。面倒な手作業の調整は、今日で終わりにしましょう。

コメント

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