送られてきたエクセルファイルなんだけど、
列の幅がデフォルトのままだから、文字が切れて見えないところがある…。
文字が全て見えるように、openpyxlで列の幅を自動調整する方法は無いの?
方法はありますよ!
少し長くなりますが、1つ1つ解説いたします!
openpyxlで列の幅を自動調整する方法を、
Python歴3年の私が、できるだけわかりやすく解説し、解決に導きます。
openpyxlで列の幅を自動調整するには
「column_dimensions」とfor文を使うことで設定可能です。
まずは実行見本をどうぞ。
実行見本
全コード
ひとまず全コードを網羅します。解説は後ほど行います。
import openpyxl
wb = openpyxl.load_workbook('input.xlsx')
ws = wb['Sheet1']
for col in ws.columns:
max_length = 0
column = col[0].column_letter
for cell in col:
try:
if len(str(cell.value)) > max_length:
max_length = len(cell.value)
except:
pass
adjusted_width = (max_length + 1) * 2
ws.column_dimensions[column].width = adjusted_width
wb.save('input.xlsx')
事前準備
- openpyxlのインストール
既存のエクセルファイルを編集するには「openpyxl」のインストールが必要です。
openpyxlのインストール方法
openpyxlを初めて使用する場合は、下記コードを入力・実行して、インストールしてください。
pip install openpyxl
※openpyxlを使用したことがある
解説
※わかりやすさを重視しております。厳密には解釈が異なる場合がありますことをご了承ください。
openpyxlの基礎解説
既存ファイルを開いて保存する方法などの操作の基本解説は、下記記事で行っております。
ご参考ください。
列の幅を自動調整(簡単に解説)
for col in ws.columns:
max_length = 0
column = col[0].column_letter
for cell in col:
try:
if len(str(cell.value)) > max_length:
max_length = len(cell.value)
except:
pass
adjusted_width = (max_length + 1) * 2
ws.column_dimensions[column].width = adjusted_width
少し長いですが、上記コードを記述することで、列の幅を自動調整することができます。
※列の幅を自動調整する方法はいろいろありますので、一例だと思ってください。
ざっくり解説いたしますと、
「各行の文字数を取得し、一番長い文字数に合わせて各列の幅を調整する」
というものになります。
詳しく知りたい方のために、次項で一つ一つ解説いたします。
列の幅を変更する基礎解説は、下記記事にて解説しております。
列の幅を自動調整(詳細な解説)
※for文の知識が必要となります。for文の基礎解説は下記記事をご参考ください。
では本題に戻ります。
for col in ws.columns:
max_length = 0
column = col[0].column_letter
max_length(最大文字数)という変数を作り、ひとまず0を代入します。
1つの列を変数に入れ、列の場所(A列なのかB列なのか)を判別します。
for cell in col:
try:
if len(str(cell.value)) > max_length:
max_length = len(cell.value)
except:
pass
1つの列(col)の中から1つのセル(cell)を変数に入れます。
cellに入った文字の文字数を取得します(A1なら3文字なので「3」)
cellの文字数がmax_length(最大文字数)より多ければ、cellの文字数をmax_lengthに代入します。
(max_lengthの最初の値は、先ほど代入した0なので、1つめのセルの文字数は必ずmax_lengthに入ります)
次々に判別していき、cellの文字数がmax_lengthより少なければpass(スルー)します。
M-1とかR-1決勝で順位が入れ替わる様子を想像していただくとわかりやすいと思います。
結果、1位(列の中で一番多い文字数)がmax_lengthに残ります。
adjusted_width = (max_length + 1) * 2
ws.column_dimensions[column].width = adjusted_width
max_lengthに残った最大文字数に応じて列の幅を決定し、
adjusted_width(調整済の幅)という変数に入れます。
(列の幅は、全角に対応するため2倍+αにしています)
決定した列の幅を実際の列に適用し、全ての列に適用できれば終了です。
ですのでざっくり解説で説明しましたとおり、
各行の文字数を取得し、一番長い文字数に合わせて各列の幅を調整
という処理になるわけです。
注意点
今回の列の幅自動調整は、漢字やひらがななどの「全角」向けのものとなっております。
半角カタカナや英数字などの「半角」文字では、幅が広すぎる状態となりますので、ご注意ください。
半角と全角両方対応した自動調整もできますが、コードが倍以上に長くなるため、今回は割愛させていただきます。
うまく動作しない時
エラーが出る
No such file or directory: ○○
これは、読み込むファイルやフォルダが見つからないというエラーです。
読み込むファイルのファイル名と構文のファイル名が一致しているか確認しましょう。
詳しい解説は、下記記事をご参考ください。
Permission denied: ○○
操作しようとしているファイルにアクセスできないというエラーです。
「ファイルを開いている状態なので編集できない」と言っていることが多いので、開いていれば閉じて再度トライしましょう。
詳しい解説は、下記記事をご参考ください。
Worksheet ○○ does not exist
「指定したシートがありません」というエラーです。
指定のシート名が間違っていないか、「sheet1」など先頭が小文字になっていないか確認しましょう。
詳しい解説は、下記記事をご参考ください。
○○ is not defined
今まで出てきていない変数などを処理しようとした時に出るエラーです。
変数名などが間違っていないかチェックしましょう。
詳しい解説は、下記記事をご参考ください。
その他のエラー
その他のエラーが出た場合は、エラー文をコピーしてNETで検索してみましょう。
最後に
openpyxlで列の幅を自動調整する方法を解説いたしました。
非常に便利かと思いますので、ぜひご活用ください。
当ブログでは、Pythonに関する情報を配信しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。
最後までお読みいただき、ありがとうございました。がんばってください。