openpyxl:for文で罫線を書く!最終行まで外枠を自動追加

表にいつも手動で罫線をつけているなら、Pythonで自動化するのもいいかもしれません。

Excelにopenpyxlライブラリで罫線(外枠)を自動で最終行まで設定する方法をご紹介します。

目標物

罫線を引くプログラムの目標物

beforeのように罫線を設定していないExcelファイルが、Pythonによって一瞬で外枠の線が自動で追加されるようになります!

行数に合わせた外枠追加

行数が変わっても大丈夫。

下の画像のように自動で最終行を取得して罫線が設定されます。

罫線を引くプログラムのポイント

Pythonのプログラム

私の考えたコードは次のとおり。

import openpyxl 

#罫線を引くために必要なimport
from openpyxl.styles.borders import Border, Side

wb=openpyxl.load_workbook("予約表テンプレート.xlsx", data_only=True)
ws=wb["Sheet1"]

#Side関数とBorder関数を定義
side=Side(style="thin", color="545454")
border_left=Border(left=side)
border_right=Border(right=side)
border_top=Border(top=side)


#両サイドに罫線を追加
for row in range(5,100):
    if ws.cell(row,2).value!=None:
        ws.cell(row,2).border=border_left
        ws.cell(row,6).border=border_right
    else:
        break
        
#底辺に罫線を追加
for col in range(2,7):
    ws.cell(ws.max_row,col).border=border_top

wb.save("予約表.xlsx")

コード解説

openpyxlで罫線を引くためのポイントは次の3つです。

  1. 罫線を引くためのimport文が必要
  2. 線の太さと色を定義する
  3. Excelの1つのセルをイメージし、上下左右どこに罫線を引くかを定義する

3番目のセルの考え方のイメージ

セルの四辺の定義イメージ

セルの四辺をtop、bottom、left、rightに分けて線をつけます。

罫線を引くために必要なimportについて

この宣言が必要で、BorderとSideは罫線を引く、色などを設定するために書きます。

#罫線を引くために必要なimport
from openpyxl.styles.borders import Border, Side

Side関数とBorder関数を定義

お好みの変数にSide()とBorder()を定義してください。

Side()には線の太さと色を、Border()にはセルの上下左右どこに罫線を引きたいのかを定義します。

線の太さはthin、medium、thickの順に太くなります。

例えばborder_right=Border(right=side)だとセルの右側に罫線が付きます。

四方に一気に線を引く場合は

border=Border(left=side, right=side, top=side, bottom=side)

のように書くことができます。

#Side関数とBorder関数を定義
side=Side(style="thin", color="545454")
border_left=Border(left=side)
border_right=Border(right=side)
border_top=Border(top=side)

for文で罫線を書く

まずは枠の両サイドにfor文で罫線を引きます。

B2セル(日付部分)に値が入っていたら罫線を引き、B2セルの値が何も無かったらストップします。

#両サイドに罫線を追加
for row in range(5,100):
    if ws.cell(row,2).value!=None:
        ws.cell(row,2).border=border_left
        ws.cell(row,6).border=border_right
    else:
        break

if ws.cell(row,2).value!=None:は、if ws.cell(row,2).value is not None:と同じで、

値が空ではなかったら、もし値が入っていたら、という意味です。

これでセルに値が無くなるまで、つまり最終行まで両サイドに罫線が引けます。

最後に底辺にも罫線を引きます。

底辺は2列目から6列目までと決まっているので、range(2,7)と設定できます。

行については、ws.max_rowで最終行を取得。

#底辺に罫線を追加
for col in range(2,7):
    ws.cell(ws.max_row,col).border=border_top

ポイントはborder_bottomではなく、border_topにしてセルの上辺に罫線を引くことです。

罫線の設定、すごく楽しいのでぜひ試してみてください!

ABOUT US
中野友梨
旅行業の会社を運営。
慶応義塾大学卒

書類作成、確認作業などに追われる日々の仕事。
一生懸命やっているつもりだった。
計算ミス、手配ミスにヒヤヒヤする日々。
仕事の効率をなんとかしなけらばいけないと思っていたけど、 どうしたらよいのか分からなかった。
Pythonの世界なんて、全く知らなかった。
そんな私がPythonで仕事が効率化されることによって、公私ともに大きく 変わるとは、夢にも思っていなかった..。

業務効率化のためにPythonを始めたことがきっかけで、Pythonにはまりました。(個人利用レベル)
詳細はこちら

労働時間が大きく削減され、仕事が大カイゼンされて自由な時間も生まれました。
私のした素晴らしい経験を共有したい、仕事の効率が悪いけど、どうにかしたいという悩みを持った人々に向けて、 Pythonがいいよ、と教えてあげたい。
このブログでは、私が経験したエラー解決や迷い所、Pythonの活用方法をお伝えします。