openpyxlでセル内の改行を削除したら、行の高さが合わなくなった…。
openpyxlで行の高さを自動調整する方法は無いの?
ありますよ!
比較的簡単にできる方法を、できるだけわかりやすく解説いたします!
【著者情報】
Python歴3年。
入社2年目の春に先輩が突然トンズラし、業務を半分肩代わりするハメに…。
今までの1.5倍の仕事をこなせるはずもなく、苦しむ毎日。
業務効率化を模索中にPythonと出合う。
業務とPythonの相性が良く、2倍以上の効率化を実現。現在も効率化を進行中。
openpyxlで行の高さを自動調整するには
「row_dimensions」とfor文を使うことで設定可能です。
まずは実行見本をどうぞ。
実行見本
全コード
ひとまず全コードを網羅します。解説は後ほど行います。
import openpyxl
wb = openpyxl.load_workbook('input.xlsx')
ws = wb['Sheet1']
i = 1
for row in ws:
max_size = 0
for cell in row:
size = cell.font.size
if size > max_size:
max_size = int(size)
ws.row_dimensions[i].height = int(max_size*1.7)
i += 1
wb.save('output.xlsx')
事前準備
- openpyxlのインストール
既存のエクセルファイルを編集するには「openpyxl」のインストールが必要です。
openpyxlのインストール方法
openpyxlを初めて使用する場合は、下記コードを入力・実行して、インストールしてください。
pip install openpyxl
※openpyxlを使用したことがある
解説
※わかりやすさを重視しております。厳密には解釈が異なる場合がありますことをご了承ください。
openpyxlの基礎解説
既存ファイルを開いて保存する方法などの操作の基本解説は、下記記事で行っております。
ご参考ください。
行の高さを自動調整(簡単に解説)
i = 1
for row in ws:
max_size = 0
for cell in row:
size = cell.font.size
if size > max_size:
max_size = int(size)
ws.row_dimensions[i].height = int(max_size*1.7)
i += 1
少し長いですが、上記コードを記述することで、行の高さを自動調整することができます。
※行の高さを自動調整する方法はいろいろありますので、一例だと思ってください。
ざっくり解説いたしますと、
「各セルのフォントサイズを取得し、一番大きいサイズに合わせて各行の高さを調整する」
というものになります。
詳しく知りたい方のために、次項で一つ一つ解説いたします。
行の高さを変更する基礎解説は、下記記事にて解説しております。
行の高さを自動調整(詳細な解説)
※for文の知識が必要となります。for文の基礎解説は下記記事をご参考ください。
では本題に戻ります。
i = 1
for row in ws:
max_size = 0
まずはカウント用に「i」という変数を作り、ひとまず1を代入します。
この「i」は、後ほど(各行を指定するために)使います
次に、「for」を使って1つの行を変数「row」に入れます。
まずはエクセルの1行目が「row」に入ります。
max_size(最大フォントサイズ)という変数を作り、for文の最初で0を代入します。
(エクセルの1行目が終わり、2行目を処理する際に再び0になる)
for cell in row:
size = cell.font.size
if size > max_size:
max_size = int(size)
1つの行(row)の中から1つのセル(cell)を変数に入れます。
cellに入った文字のフォントサイズを取得します(A1なら14ポイントなので「14」)
cellのフォントサイズがmax_size(最大フォントサイズ)より大きければ、
cellのフォントサイズをmax_sizeに代入します。
(max_sizeの最初の値は、先ほど代入した0なので、1つめのセルのフォントサイズは必ずmax_sizeに入ります)
次々に判別していき、cellのフォントサイズがmax_sizeより小さければ何も起こりません。
M-1とかR-1決勝で順位が入れ替わる様子を想像していただくとわかりやすいと思います。
結果、1位(行の中で一番大きいフォントサイズ)がmax_sizeに残ります。
ws.row_dimensions[i].height = int(max_size*1.7)
i += 1
max_sizeに残った最大フォントサイズに応じて行の高さを決定しています。
(今回は最大フォントサイズの1.7倍にしていますが、お好みで)
「i」には1が入っていますので、まずはエクセルの1行目が調整されます。
調整が終わったら、「i」に1を追加してfor文の最初に戻ります(エクセルの2行目に移る)
※「i += 1」は「i = i + 1」と同じで、2・3・4と、どんどんiが加算されていきます。
2行目・3行目…と処理していき、全ての行が調整できれば終了です。
ですのでざっくり解説で説明しましたとおり、
各セルのフォントサイズを取得し、一番大きいサイズに合わせて各行の高さを調整
という処理になるわけです。
注意点
今回の行の高さ自動調整は、セル内の改行(\n)が入っていないことを前提としています。
改行が入っている場合はうまく調整されませんので、改行を削除してからトライしてください。
openpyxlで改行を削除することもできます。
下記記事をご参考ください。
うまく動作しない時
エラーが出る
No such file or directory: ○○
これは、読み込むファイルやフォルダが見つからないというエラーです。
読み込むファイルのファイル名と構文のファイル名が一致しているか確認しましょう。
詳しい解説は、下記記事をご参考ください。
Permission denied: ○○
操作しようとしているファイルにアクセスできないというエラーです。
「ファイルを開いている状態なので編集できない」と言っていることが多いので、開いていれば閉じて再度トライしましょう。
詳しい解説は、下記記事をご参考ください。
Worksheet ○○ does not exist
「指定したシートがありません」というエラーです。
指定のシート名が間違っていないか、「sheet1」など先頭が小文字になっていないか確認しましょう。
詳しい解説は、下記記事をご参考ください。
○○ is not defined
今まで出てきていない変数などを処理しようとした時に出るエラーです。
変数名などが間違っていないかチェックしましょう。
詳しい解説は、下記記事をご参考ください。
その他のエラー
その他のエラーが出た場合は、エラー文をコピーしてNETで検索してみましょう。
最後に
openpyxlで行の高さを自動調整する方法を解説いたしました。
非常に便利かと思いますので、ぜひご活用ください。
当ブログでは、Pythonに関する情報を配信しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。
最後までお読みいただき、ありがとうございました。がんばってください。