クライアントの指示で、送られてきたファイルに書式を合わせた資料を作ることになった…。
行の高さや列の幅を1つ1つ確認するのはめんどうだから、一括で取得したい!
openpyxlで行の高さや列の幅を取得する方法は無いの?
ありますよ!
では今回は、「openpyxlで行の高さや列の幅を取得する方法」を
できるだけわかりやすく解説いたします。
また、「取得した行の高さや列の幅を別のブックにコピーする方法」
も紹介いたしますので、ぜひ最後まで読んでいってください。
openpyxlで行の高さや列の幅を取得する方法
「row_dimensions」「column_dimensions」を使います。まずは全コードと実行結果をお見せします。
解説は後ほど行います。
全コード
import openpyxl
wb = openpyxl.load_workbook('C://Utatane/input.xlsx')
ws = wb['Sheet1']
row_height_1 = ws.row_dimensions[1].height
column_width_a = ws.column_dimensions['A'].width
print(f'1行目の高さ:{row_height_1}/A列の幅:{column_width_a}')
row_height_1 = ws.row_dimensions[1].height
column_width_a = ws.column_dimensions['A'].width
実行結果
事前準備
- openpyxlのインストール
既存のエクセルファイルを編集するには「openpyxl」のインストールが必要です。
openpyxlのインストール方法
openpyxlを初めて使用する場合は、下記コードを入力・実行して、インストールしてください。
pip install openpyxl
※openpyxlを使用したことがある場合は、このインストール作業は不要です。
インストールに関する詳細や、インストールができなかった場合の対処法は下記記事で解説しております。
また、既存ファイルを開いて保存する方法など、基本解説も行っておりますのでご参考ください。
解説
※わかりやすさを重視しております。厳密には解釈が異なる場合がありますことをご了承ください。
row_height_1 = ws.row_dimensions[1].height
column_width_a = ws.column_dimensions['A'].width
コードの6行目でエクセル1行目の高さを取得し、コードの7行目でA列の幅を取得しています。
まずは6行目から解説いたします。
row_height_1 = ws.row_dimensions[1].height
新しい名前の変数を書いたら、「=(イコール)」を書きます。
変数の名前について、今回はわかりやすく「row_height_1(1行目)」という名前にしましたが、何でも構いません。
しかしながら、付けられない名前があったり、注意点もあります。
詳細は下記記事をご参考ください。
コードの解説に戻ります。
イコールの後ろには、ワークシートが入った変数(ws)に続けて「.row_dimensions[].height」を書いてください。
[]内に、取得する行の番号(何行目か)を書いて完了です。
これで1行目の高さを取得することができます。
7行目の「列の幅」も、6行目の「行の高さ」とほぼ同じです。
column_width_a = ws.column_dimensions['A'].width
右辺には、wsの後に「.column_dimensions[].width」を書きます。
列の場合、[]内は列のアルファベット(今回はA)を書いて「’(クォーテーション)」で囲ってください。
行の高さ・列の幅を取得するエクセルファイルが下図です。
実行してみましょう。
行の高さと列の幅が取得できました。
幅より高さの数値が大きいのは、高さと幅の単位が違うからです。
詳細は下記記事をご参考ください。
取得方法がわかったら、今度は別ブックにコピーする方法です。
次項で解説いたします。
行の高さや列の幅を一括で別ブックにコピーする方法
下記コードにて、「input.xlsx」の行の高さや列の幅を一括で取得して、「output.xlsx」に適用することができます。要は行の高さ・列の幅をコピーすることができるわけです。
import openpyxl
wb_in = openpyxl.load_workbook('C://Utatane/input.xlsx')
ws_in = wb_in['Sheet1']
wb_out = openpyxl.load_workbook('C://Utatane/output.xlsx')
ws_out = wb_out['Sheet1']
for row in ws_in.row_dimensions:
if ws_in.row_dimensions[row].height is not None:
ws_out.row_dimensions[row].height = ws_in.row_dimensions[row].height
for col in ws_in.column_dimensions:
if ws_in.column_dimensions[col].width is not None:
ws_out.column_dimensions[col].width = ws_in.column_dimensions[col].width
wb_out.save('C://Utatane/output.xlsx')
ざっくりですが、解説いたします。
【コード3・4行目】
コピー元のブック・シートを取得
【コード6・7行目】
コピー先のブック・シートを取得
【コード9~11行目】
コピー元シートの「行の高さ」を取得し、コピー先シートに適用
【コード13~15行目】
コピー元シートの「列の幅」を取得し、コピー先シートに適用
実行結果は下図のとおりです。
関連記事として、行の高さや列の幅を自動調整する方法を解説しておりますので、ご参考ください。
うまく動作しない場合の対処法
エラーが出る
No such file or directory: ○○
これは、読み込むファイルやフォルダが見つからないというエラーです。
読み込むファイルのファイル名と構文のファイル名が一致しているか確認しましょう。
詳しい解説は、下記記事をご参考ください。
Permission denied: ○○
操作しようとしているファイルにアクセスできないというエラーです。
「ファイルを開いている状態なので編集できない」と言っていることが多いので、開いていれば閉じて再度トライしましょう。
詳しい解説は、下記記事をご参考ください。
Worksheet ○○ does not exist
「指定したシートがありません」というエラーです。
指定のシート名が間違っていないか、「sheet1」など先頭が小文字になっていないか確認しましょう。
詳しい解説は、下記記事をご参考ください。
○○ is not defined
今まで出てきていない変数などを処理しようとした時に出るエラーです。
変数名などが間違っていないかチェックしましょう。
詳しい解説は、下記記事をご参考ください。
その他のエラー
その他のエラーが出た場合は、エラー文をコピーしてNETで検索してみましょう。
最後に
openpyxlで行の高さや列の幅を取得する方法を解説いたしました。
当ブログでは、Pythonに関する情報を配信しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。
挫折せずにPythonを独学で学習する方法は特におすすめです。
最後までお読みいただき、ありがとうございました。がんばってください!