さっき作った会議資料なんだけど、印刷したら2つ目の議題が途中で切れてしまった…。
各議題がキチンと1ページで収まるように、改ページを設定したいんだけど、
openpyxlでできるの?
なるほど…。
では今回は、「openpyxlで改ページを設定する方法」を
できるだけわかりやすく解説いたします。
また、「空白行で区切る方法」や「文字サイズで区切る方法」
も紹介いたしますので、ぜひ最後まで読んでいってください。
openpyxlで改ページを設定する方法
「page_breaks」を使います。まずは全コードと実行結果をお見せします。
解説は後ほど行います。
全コード
import openpyxl
from openpyxl.worksheet.pagebreak import Break
wb = openpyxl.load_workbook('C://Utatane/input.xlsx')
ws = wb['Sheet1']
ws.page_breaks[0].append(Break(id=21))
wb.save('C://Utatane/output.xlsx')
from openpyxl.worksheet.pagebreak import Break
ws.page_breaks[0].append(Break(id=21))
実行結果
事前準備
- openpyxlのインストール
既存のエクセルファイルを編集するには「openpyxl」のインストールが必要です。
openpyxlのインストール方法
openpyxlを初めて使用する場合は、下記コードを入力・実行して、インストールしてください。
pip install openpyxl
※openpyxlを使用したことがある場合は、このインストール作業は不要です。
インストールに関する詳細や、インストールができなかった場合の対処法は下記記事で解説しております。
また、既存ファイルを開いて保存する方法など、基本解説も行っておりますのでご参考ください。
解説
※わかりやすさを重視しております。厳密には解釈が異なる場合がありますことをご了承ください。
まずはインポートの解説です。
from openpyxl.worksheet.pagebreak import Break
上記一文にて、改ページを行うために必要な「Break」関連をインポートすることができます。
大文字と小文字が混在しているところがありますのでご注意ください。
全部小文字にしてしまうと動きません。
次に本題の解説です。
ws.page_breaks[0].append(Break(id=21))
上記一文にて、改ページを入れることができます。
まずワークシートが入った変数に続けて「.page_breaks[0].append()」を書きます。
()内には「Break()」を書いてください。
「Break()」の()内には、改ページを入れる箇所を指定します。
「id=21」と指定すれば、21行目の下に改ページを入れることができます。
idは行数のことだと思ってください。
これで下図のように改ページを入れることができました。
しかしながら、行数を確認してコードを書く必要があり、あまり効率的とはいえません。
さらに、議題がもう1つあった場合は下図のようになってしまいます。
そこで次項では、空白行を判定して改ページを入れる方法を紹介いたします。
空白行を判定して区切る
空白行を判定して改ページを入れる方法です。
まずは元データを見てください。
各議題の間に空白行があります。
この空白行の下に改ページを入れることができたら便利ですよね。
そんな便利な方法を紹介いたします。
import openpyxl
from openpyxl.worksheet.pagebreak import Break
wb = openpyxl.load_workbook('C://Utatane/input.xlsx')
ws = wb['Sheet1']
for row in ws.iter_rows():
if all(cell.value is None for cell in row):
ws.page_breaks[0].append(Break(id=row[0].row))
wb.save('C://Utatane/output.xlsx')
上記コードにて、空白行の下に改ページを入れることができます。
【7行目】
for文を開始します。
「iter_rows」でシート内のセルの値を取得し、各行ごとのデータを「row」に格納します。
「for文」、「iter_rows」については下記記事をご参考ください。
【8行目】
行データ(row)から各セルごとのデータを「cell」に格納し、if文で空白を判定しています。
if文については下記記事をご参考ください。
【9行目】
改ページを入れています(前項での解説とほぼ同じ)
「(id=row[0].row)」は行データ(row)の[0]番目(A列)が空白の個所を探すという処理です。
これで、空白行の下に改ページを入れることができました。
しかしながら、議題の境目以外にも空白行がたくさんあったら、改ページだらけになってしまいます…。
そこで次項では、文字サイズを判定して改ページを入れる方法を紹介いたします。
文字サイズを判定して区切る
文字サイズを判定して改ページを入れる方法です。
議題のタイトルは、だいたい文字サイズを大きくしている場合が多く、サイズを揃えている場合は使えると思います。
早速コードを見ていきましょう。
import openpyxl
from openpyxl.worksheet.pagebreak import Break
wb = openpyxl.load_workbook('C://Utatane/input.xlsx')
ws = wb['Sheet1']
for cell in ws['A']:
if cell.font.sz == 20:
ws.page_breaks[0].append(Break(id=cell.row-1))
wb.save('C://Utatane/output.xlsx')
上記コードにて、A列の文字サイズが20ポイントなら、その上に改ページを入れることができます。
基本的には前項の「空白行判定」と同じで、「文字サイズ」を判定しています。
前項と大きく違うのは、文字サイズ20ポイントの行の上で区切りたいので、
(id=cell.row-1)としています。
下図が実行後の見本です。
議題タイトルの上で区切られているのがわかります。
うまく動作しない場合の対処法
エラーが出る
No such file or directory: ○○
これは、読み込むファイルやフォルダが見つからないというエラーです。
読み込むファイルのファイル名と構文のファイル名が一致しているか確認しましょう。
詳しい解説は、下記記事をご参考ください。
Permission denied: ○○
操作しようとしているファイルにアクセスできないというエラーです。
「ファイルを開いている状態なので編集できない」と言っていることが多いので、開いていれば閉じて再度トライしましょう。
詳しい解説は、下記記事をご参考ください。
Worksheet ○○ does not exist
「指定したシートがありません」というエラーです。
指定のシート名が間違っていないか、「sheet1」など先頭が小文字になっていないか確認しましょう。
詳しい解説は、下記記事をご参考ください。
○○ is not defined
今まで出てきていない変数などを処理しようとした時に出るエラーです。
変数名などが間違っていないかチェックしましょう。
詳しい解説は、下記記事をご参考ください。
その他のエラー
その他のエラーが出た場合は、エラー文をコピーしてNETで検索してみましょう。
最後に
openpyxlで改ページを設定する方法を解説いたしました。
当ブログでは、Pythonに関する情報を配信しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。
挫折せずにPythonを独学で学習する方法は特におすすめです。
最後までお読みいただき、ありがとうございました。がんばってください!