はじめに:オートフィルタを「使いこなす」ための次の一歩
PythonのopenpyxlでExcelのオートフィルタを設定できることは、多くの自動化スクリプトの基本です。しかし、'特定の値'で絞り込むだけでは、この強力な機能の真価を半分も引き出せていません。
Excelのオートフィルタの真価は、「売上が100万以上」や「商品名に’Pro’を含む」といったカスタム条件での絞り込みにあります。この「カスタムフィルタ」をPythonから自在に操るための鍵がCustomFilterクラスです。
この記事では、openpyxlのCustomFilterを徹底的に解説し、あなたのExcelオートフィルタ操作を「知っている」レベルから「使いこなす」レベルへと引き上げます。
CustomFilterとは?オートフィルタの頭脳
CustomFilterは、openpyxlで高度なフィルタ条件を定義するためのクラスです。単純な値でのフィルタリングとは異なり、「どの列を」「どのような条件で」「どの値と比較して」絞り込むかを細かく指定できます。
この機能を使うための基本的な流れは以下の3ステップです。
ws.auto_filter.ref = "範囲": まず、シート全体でオートフィルタを有効にする。CustomFilterでルールを作成: 「operator(演算子)」と「val(値)」を指定して、個別の絞り込みルールを作る。- ルールを列に適用: 作成したルールを、対象となる列に適用する。
この流れを理解すれば、どんな複雑なフィルタリングも可能になります。
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 | 〜を含まない |
この表を参考に、目的に合った演算子を選んでください。
まとめ:もうオートフィルタで悩まない!
今回は、openpyxlのCustomFilterを使いこなし、高度なオートフィルタを自動設定する方法を解説しました。
- 数値の大小比較 (
greaterThan,lessThanOrEqualなど) が可能。 - 文字列の部分一致 (
containsText,beginsWithなど) も自由自在。 - **
CustomFilterでルールを作り、FilterColumn**で適用する列を決めるのが基本の流れ。
CustomFilterは、あなたのデータ前処理やレポート作成の自動化を、次のレベルへと引き上げてくれる強力な武器です。もう手作業での複雑なフィルタリングは必要ありません。この機能をマスターし、より高度で効率的なExcel自動化を実現しましょう。


コメント