Pythonで罫線付き表の範囲を自動取得する方法|openpyxl活用

当ページのリンクには広告 (Amazonアソシエイト含む) が含まれています。

毎回レイアウトが違うExcelの表、Pythonでどう処理すればいいの…?
このように悩んだことはありませんか?

このような事で悩んでいませんか?

・シートごとに表の開始位置や範囲がバラバラ

・規則性もなく、毎回手作業で確認している

・自動化しようにも、範囲の特定ができない…

私自身も、毎回異なるExcel表の範囲をどうやって自動で取得するかで、本当に悩みました。

同じように、「セルの位置も罫線も毎回違うから、自動で表を取るのが難しい…」と感じた方には、きっと役立つ内容です。

この記事では、PythonでExcelファイルを操作できるライブラリ「openpyxl」を使い、罫線で囲まれた表の範囲(最終行・最終列含む)を自動的に取得する方法をご紹介します。

このコードはコピペするだけで使用できるようにしています。
Python × Excel での作業効率化を、一緒に目指していきましょう!


よく使う度
難しさ
覚えておくと安心度

「Pythonを始めたいけど、どの本を選べばいいのか分からない…」
そんなふうに迷ったことはありませんか?

私も最初は同じでした。
でも、図解が多くて手を動かしながら学べる入門書を選んだことで、スムーズに理解できるようになりました。

これから始める方にぴったりな、やさしく学べるPython本をいくつかご紹介します。

目次

この記事でできるようになること

スポンサーリンク

まずはコピペで使える!Python×openpyxlで罫線に囲まれた表の範囲を取得する方法

「Excelの表の位置が毎回違うから、自動処理がうまくいかない…」
そんな悩みを解決する、コピペで使えるクラスコードをご紹介します!

以下のクラスを使えば、罫線で囲まれた表の上下左右のセル位置(最終行・最終列)を自動で取得できます。

このコードの仕組みを簡単にご紹介

  • 初期設定
    • 表の中にあるセルの行・列を指定します(例:6行目・5列目など)
  • 処理内容
    • そこを起点に、上下左右に向かって罫線(実線 "thin")をたどり、表の範囲を取得します

コードを記載します。(そのままコピペでOK)

import openpyxl

# 実線で囲われたセルの範囲を取得する
class Get_border_cell():
    def __init__(self, init_row, init_col, wb, ws):
        self.wb = wb
        self.ws = ws
        self.init_row = init_row
        self.init_col = init_col
        self.max_row = self.ws.max_row+1
        self.max_col = self.ws.max_column+1

    # 上を見ていき実線となる行を取得
    def get_border_top(self):
        row_top = None
        for row in range(self.init_row, 1, -1):
            if self.ws.cell(row=row, column=self.init_col).border.top.style == "thin":
                row_top = row
                break
        return row_top

    # 下を見ていき実線となる行を取得
    def get_border_bottom(self):
        row_bottom = None
        for row in range(self.init_row, self.max_row):
            if self.ws.cell(row=row, column=self.init_col).border.bottom.style == "thin":
                row_bottom = row
                break
        return row_bottom
    
    # 左を見ていき実線となる列を取得
    def get_border_left(self):
        col_left = None
        for col in range(self.init_col, 0, -1):
            if self.ws.cell(row=self.init_row, column=col).border.left.style == "thin":
                col_left = col
                break
        return col_left

    # 右を見ていき実線となる列を取得
    def get_border_right(self):
        col_right = None
        for col in range(self.init_col, self.max_col):
            if self.ws.cell(row=self.init_row, column=col).border.right.style == "thin":
                col_right = col
                break
        return col_right

    # 行・列を再定義する際に使用
    def set_position(self, row, col):
        self.init_row = row
        self.init_col = col
        
        
if __name__ == "__main__":
    filePath = r"sample.xlsx"
    wb = openpyxl.load_workbook(filePath)
    ws = wb.active

    cell_border = Get_border_cell(init_row=6, init_col=5, wb=wb, ws=ws)

    print(f"上:{cell_border.get_border_top()}行")
    print(f"下:{cell_border.get_border_bottom()}行")
    print(f"左:{cell_border.get_border_left()}列")
    print(f"右:{cell_border.get_border_right()}列")

処理結果

このように表の位置が変わっても範囲を取得することができます。

処理結果

【Python × openpyxl】罫線で囲まれた表の範囲取得の使い方をやさしく解説!

先ほどのコードは、罫線(実線)で囲まれたExcelの表の範囲(上下左右)をPythonで自動的に見つけてくれるクラスです。
表の位置がシートごとに違っても、「このセルは表の中だよ」と最初にセル場所教えてあげれば、罫線をたどって範囲を特定してくれます。

ロボット

使い方のステップ

STEP
Excelファイルを読み込む

openpyxlload_workbook() を使ってファイルを開きます。

詳細コードを見る

STEP
任意のセルを起点として指定

表の中にあるセルの行・列を指定します。(例:6行目・5列目)

詳細コードを見る

STEP
クラスを使って上下左右の罫線をチェック

get_border_top() などで各方向に罫線があるか調べます。

詳細コードを見る

STEP
表の範囲(行・列)を取得

結果として、表全体のセル範囲がわかります。

詳細コードを見る

① Excelファイルを読み込む

まずは、openpyxlを使ってExcelファイルを読み込みます。
load_workbook() 関数を使うだけで簡単に読み込めます。

import openpyxl

filePath = r"sample.xlsx"
wb = openpyxl.load_workbook(filePath)
ws = wb.active
ポイント
  • r をつけることでパス内のバックスラッシュをエスケープ不要にします。
  • .active で最初のシートを取得することができます。

② 任意のセルを起点として指定

次に、表の中にあるセルの行・列を起点として指定します。
このセルをもとに、クラスが周囲の罫線をチェックします。

cell_border = Get_border_cell(init_row=6, init_col=5, wb=wb, ws=ws)
ポイント
  • init_row=6, init_col=5 は「6行目・5列目(例:セルE6)」を指定しています。
    ※ここのセル位置は、任意で変更してください。
  • 起点セルは必ず表の内側にしてください!

③ クラスで上下左右の罫線をチェック

いよいよ、罫線の判定処理を実行します。
このクラスでは、上下左右に向かって罫線("thin")があるかを調べてくれます。

top = cell_border.get_border_top()
bottom = cell_border.get_border_bottom()
left = cell_border.get_border_left()
right = cell_border.get_border_right()
■ クラスの中では何をしているの? (get_border_top()で解説) 

各メソッド(例:get_border_top())は、指定したセルを起点に、上方向(行番号が小さくなる方向)へ1つずつセルをたどっていき、そのセルの罫線情報(border.top.style)をチェックしています。

def get_border_top(self):
    row_top = None
    for row in range(self.init_row, 1, -1):
        if self.ws.cell(row=row, column=self.init_col).border.top.style == "thin":
            row_top = row
            break
    return row_top
ポイント
  • self.init_row(起点の行)から、上に向かって1行ずつループします。
  • border.top.style == "thin" という条件で、「細線の罫線があるセル」を探します。
  • 最初に見つけたセルで break(ループ終了)して、その行番号を返します。
  • 同様に、get_border_bottom() では border.bottom.style を見ています。
■ 補足:他の方向も同じ考え方です
スクロールできます
メソッド名見ている罫線方向
get_border_top()border.top.style上方向
get_border_bottom()border.bottom.style下方向
get_border_left()border.left.style左方向
get_border_right()border.right.style右方向

すべて同じロジック構造で、チェックする方向と border の属性が違うだけです。

④ 表の範囲(行・列)を取得

取得した「上下左右のセル位置」を使って、表の範囲を表示させます。

print(f"上:{top}行")
print(f"下:{bottom}行")
print(f"左:{left}列")
print(f"右:{right}列")

このように、罫線で囲まれた表の位置を自動的に特定することができました。

スポンサーリンク

Python × openpyxlで表範囲を取得する際の「よくある質問と注意点」【FAQ】

起点セルはどこを指定すればいいですか?(表の中?外?)

罫線で囲まれた表の“内側のセル”を指定する必要があります。

表の外や罫線がないセルを指定すると、範囲が見つからず None になる場合があります。

太線(thick)や点線(dashed)の罫線は認識されますか?

このコードでは、「細線(”thin”)」だけを検出対象としています。

太線や他の線種も検出したい場合は、以下のように条件を調整してください。

if cell.border.top.style in ["thin", "medium", "thick"]:
    # 太線や中線も検出

表のセルに値が入っていなくても検出されますか?

セルが空でも罫線があれば範囲として認識されます。

中身の有無ではなく、「罫線で囲われているか?」が基準です。
必要に応じて .value をチェックして空白セルを除外することもできます。

表が見つからないとき、エラーになりますか?

エラーにはなりませんが、None が返ってくるので、そのまま使うとエラーになる可能性があります。

安全に処理するには、次のように分岐させましょう。

if top and bottom and left and right:
    print("表が見つかりました!")
else:
    print("罫線が検出できませんでした。起点セルを見直してみましょう。")
スポンサーリンク

罫線付き表の範囲取得を活かしたPython活用アイデア集

せっかく表の範囲が自動で取得できるようになったので、
ここからは実際の業務や自動処理でどう使えるのか?活用アイデアをご紹介します!

ちょっとした工夫で、毎日のExcel作業が一気にラクになりますよ。

アイデア集
  1. 表データをpandasに読み込んで自動集計
    • 取得した範囲をもとに、必要なデータだけをpandasに渡して、集計・分析が可能です。
  2. 複数シートの表を一括で読み取る
    • 請求書や日報など、複数のシートに表がある場合にも、同じロジックを使えば全シートをループして表だけ取得できます。
  3. 取得した範囲だけをCSVに出力
    • 必要な表データだけを別ファイルに保存することで、余分なセルを省いて業務効率化!
  4. 帳票テンプレートの自動入力や検査に応用
    • テンプレートの表範囲を自動で特定し、指定した位置に値を書き込んだり、チェックしたりできます。
  5. 業務報告書・見積書からデータベース化
    • 社内のフォーマットがある場合、その表範囲を自動検出してデータベース登録まで自動化できます。
スポンサーリンク

この記事のまとめ

この記事では、Python×openpyxl を使って、罫線で囲まれたExcel表の範囲(上下左右)を自動で取得する方法について解説しました。

「表の位置が毎回違うから自動処理できない…」と悩んでいた方も、
起点となるセルを指定するだけで、罫線をたどって表の範囲を特定できる便利なクラスコードを手に入れられたと思います。

ポイントのおさらい

今回のコードをうまく活かすコツ

  • 起点となるセルは必ず表の「内側」を指定しましょう。
  • 罫線スタイル(”thin” 以外)を検出したい場合はstyle条件を調整しましょう。
  • 結果が None の可能性も考慮してエラーハンドリングを追加しましょう。

Pythonと openpyxl の知識をさらに深めたい方は、以下の記事も参考にしてください。

あわせて読みたい
サイトマップ このページは、本サイトの記事を分かりやすくまとめました。ぜひご覧ください。 目次 「共通」を見る 「VBA」を見る 「Officeスクリプト」を見る 「ワークシート関数」...
スポンサーリンク
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次