PythonでExcelオートフィルタを使いこなす!openpyxl CustomFilter解説

openpyxl

はじめに:オートフィルタを「使いこなす」ための次の一歩

PythonのopenpyxlでExcelのオートフィルタを設定できることは、多くの自動化スクリプトの基本です。しかし、'特定の値'で絞り込むだけでは、この強力な機能の真価を半分も引き出せていません。

Excelのオートフィルタの真価は、「売上が100万以上」や「商品名に’Pro’を含む」といったカスタム条件での絞り込みにあります。この「カスタムフィルタ」をPythonから自在に操るための鍵がCustomFilterクラスです。

この記事では、openpyxlCustomFilterを徹底的に解説し、あなたのExcelオートフィルタ操作を「知っている」レベルから「使いこなす」レベルへと引き上げます。

CustomFilterとは?オートフィルタの頭脳

CustomFilterは、openpyxlで高度なフィルタ条件を定義するためのクラスです。単純な値でのフィルタリングとは異なり、「どの列を」「どのような条件で」「どの値と比較して」絞り込むかを細かく指定できます。

この機能を使うための基本的な流れは以下の3ステップです。

  1. ws.auto_filter.ref = "範囲": まず、シート全体でオートフィルタを有効にする。
  2. CustomFilterでルールを作成: 「operator(演算子)」と「val(値)」を指定して、個別の絞り込みルールを作る。
  3. ルールを列に適用: 作成したルールを、対象となる列に適用する。

この流れを理解すれば、どんな複雑なフィルタリングも可能になります。

Level 1: 基本的なカスタムフィルタをマスターする

まずは、最もシンプルな「〜以上」という条件でフィルタをかけてみましょう。

Step 1: フィルタ対象のデータを用意

from openpyxl import Workbook

wb = Workbook()
ws = wb.active
ws.title = "FilterMaster"
ws.append(["ID", "製品名", "在庫数"])
data = [
    ("S001", "イヤホン Standard", 120),
    ("P001", "イヤホン Pro", 45),
    ("S002", "キーボード Standard", 88),
    ("P002", "キーボード Pro", 15),
    ("S003", "マウス Standard", 210),
]
for row in data:
    ws.append(row)
wb.save("inventory.xlsx")
print("サンプルデータを作成しました。")

Step 2: 在庫数が50以上の製品を絞り込む

在庫数(C列)が50以上の製品だけを表示するフィルタを設定します。

from openpyxl import load_workbook
from openpyxl.worksheet.filters import FilterColumn, CustomFilter, CustomFilters

wb = load_workbook("inventory.xlsx")
ws = wb.active

# 1. オートフィルタをA1:C6の範囲に設定
ws.auto_filter.ref = ws.dimensions

# 2. カスタムフィルタのルールを作成
#    演算子: greaterThanOrEqual (以上), 値: 50
rule = CustomFilter(operator="greaterThanOrEqual", val=50)

# 3. ルールを適用する列を指定
#    colId=2 はC列 (0から数えて3番目)
filter_column = FilterColumn(colId=2)
filter_column.customFilters = CustomFilters(customFilter=[rule])

# 4. オートフィルタに列ごとの設定を追加
ws.auto_filter.filterColumn.append(filter_column)

wb.save("inventory_filtered.xlsx")
print("在庫数が50以上の製品でフィルタしたファイルを保存しました。")

このファイルを開くと、在庫数が45と15の製品が非表示になっているはずです。これがカスタムフィルタの基本です。

Level 2: 文字列フィルタを使いこなす

CustomFilterは、数値だけでなく文字列の絞り込みも得意です。

「Pro」という単語を含む製品を絞り込む

製品名(B列)に'Pro'という文字列が含まれるものだけを抽出してみましょう。

# ... (ファイルのロード部分は省略) ...
ws.auto_filter.ref = ws.dimensions

# 文字列を含む、というルールを作成
# 演算子: containsText, 値: "Pro"
rule = CustomFilter(operator="containsText", val="Pro")

# B列 (colId=1) に適用
filter_column = FilterColumn(colId=1)
filter_column.customFilters = CustomFilters(customFilter=[rule])
ws.auto_filter.filterColumn.append(filter_column)

wb.save("inventory_filtered_pro.xlsx")
print("'Pro'を含む製品でフィルタしたファイルを保存しました。")

CustomFilter演算子リファレンス

カスタムフィルタを使いこなすには、どのようなoperatorが使えるかを知っておくことが不可欠です。

演算子 (operator)意味
equal等しい
notEqual等しくない
greaterThanより大きい >
greaterThanOrEqual以上 >=
lessThanより小さい <
lessThanOrEqual以下 <=
beginsWith〜で始まる
endsWith〜で終わる
containsText〜を含む
notContainsText〜を含まない

この表を参考に、目的に合った演算子を選んでください。

まとめ:もうオートフィルタで悩まない!

今回は、openpyxlCustomFilterを使いこなし、高度なオートフィルタを自動設定する方法を解説しました。

  • 数値の大小比較 (greaterThan, lessThanOrEqualなど) が可能。
  • 文字列の部分一致 (containsText, beginsWithなど) も自由自在。
  • **CustomFilterでルールを作り、FilterColumn**で適用する列を決めるのが基本の流れ。

CustomFilterは、あなたのデータ前処理やレポート作成の自動化を、次のレベルへと引き上げてくれる強力な武器です。もう手作業での複雑なフィルタリングは必要ありません。この機能をマスターし、より高度で効率的なExcel自動化を実現しましょう。

コメント

タイトルとURLをコピーしました