現代の企業オフィスにおいて、売上記録、在庫リスト、従業員情報などのデータはExcelスプレッドシートとして蓄積されることが一般的です。数百・数千件のレコードから「特定の地域の全注文」「未発送の保留中レコード」「重要フィールドが欠落している異常行」を素早く探し出す場合、手動でフィルターのドロップダウンをクリックする方法は非効率であり、データが更新されるたびに同じ操作を繰り返す必要があります。見落としやミスの原因にもなりかねません。特に定期的に業務レポートを作成する場面では、このような繰り返し作業は手間がかかるだけでなく、結果の一貫性を保証することも困難です。
PythonプログラミングによってExcelデータのフィルタリングを実現すれば、フィルタールールを再利用可能なスクリプトとして定着させることができます。データ量がどれだけ多く、更新頻度がどれだけ高くても、コードを実行するだけで安定して期待通りの結果を得ることができ、バッチ処理や定期タスク、より包括的なデータパイプラインにも簡単に統合できます。手動操作と比較して、プログラムによるフィルタリングには、再現可能性、追跡可能性、一括処理といった顕著な利点があります。
本文では、Free Spire.XLS for Pythonを使用して、Excelワークシートでオートフィルターを有効にし、テキスト条件や空白・非空白値などのさまざまなルールでデータを絞り込む方法を紹介します。多くのチュートリアルでは読者が事前にサンプルファイルを用意する必要がありますが、本文のすべてのコード例はプログラム内で英語のサンプルデータを含むワークシートを新規作成するため、コードをそのまま実行するだけでフィルタリング効果を確認でき、追加のドキュメント準備は不要です。
1. 環境準備とライブラリのインストール
まず、Free Spire.XLS for Pythonをインストールする必要があります:
pip install spire.xls.free
インストールが完了したら、すべてのサンプルは以下の2行でインポートして使用します:
from spire.xls import *
from spire.xls.common import *
2. サンプルデータを含むワークシートの作成
サンプルコードを完全に自己完結型にするために、まずプログラム内でSalesRecordsという名前の売上記録テーブルを作成し、英語の業務データで塗りつぶします。以降のすべてのフィルタリングデモは、このワークシートを再利用します。
from spire.xls import *
# サンプルワークブックを作成し、英語の業務データを書き込む
def create_sample_workbook():
# 1 ドキュメントオブジェクトを作成
wb = Workbook()
sheet = wb.Worksheets[0]
sheet.Name = "SalesRecords"
# 2 サンプルデータを追加(英語)
headers = ["OrderID", "Region", "Product", "Salesperson", "Amount", "Status"]
for col, header in enumerate(headers, start=1):
sheet.Range[1, col].Text = header
rows = [
["ORD-1001", "North", "Laptop", "Alice", 1200, "Shipped"],
["ORD-1002", "South", "Phone", "Bob", 800, "Pending"],
["ORD-1003", "East", "Tablet", "Carol", 600, "Shipped"],
["ORD-1004", "South", "Laptop", "David", 1500, "Shipped"],
["ORD-1005", "West", "Phone", "Eve", 900, ""],
["ORD-1006", "North", "Tablet", "Frank", 450, "Cancelled"],
["ORD-1007", "South", "Tablet", "Grace", 700, "Pending"],
["ORD-1008", "East", "Laptop", "Heidi", 1300, "Shipped"],
["ORD-1009", "West", "Laptop", "Ivan", 1100, "Pending"],
["ORD-1010", "North", "Phone", "Judy", 950, "Shipped"],
]
for row_idx, row in enumerate(rows, start=2):
for col_idx, value in enumerate(row, start=1):
if isinstance(value, str):
sheet.Range[row_idx, col_idx].Text = value
else:
sheet.Range[row_idx, col_idx].NumberValue = value
# 3 列幅を自動調整
sheet.Range.AutoFitColumns()
return wb, sheet
# 4 ドキュメントを保存
wb, sheet = create_sample_workbook()
wb.SaveToFile("SalesRecords.xlsx", ExcelVersion.Version2013)
wb.Dispose()
print("サンプルワークシートを作成しました:SalesRecords.xlsx")
ワークシートプレビュー:
説明:
- データテーブルは6つのフィールドを含みます:
OrderID(注文番号)、Region(地域)、Product(製品)、Salesperson(営業担当者)、Amount(金額)、Status(ステータス)。実際の販売業務シーンにより近い構成になっています。 -
ORD-1005のStatusフィールドは意図的に空白にしており、後述の空白値フィルタリングのデモに使用します。 - 本文の以降のすべてのフィルタリングサンプルは
create_sample_workbook()を呼び出してこのワークシートを再利用し、各コードスニペットが独立して実行できるようにしています。
3. オートフィルターを有効にする(フィルター範囲の設定)
Excelでフィルタリングを実行する第一步は、「どのセルがフィルター可能なデータ領域か」をプログラムに伝えることです。ヘッダー行にAutoFilters.Rangeを設定することで、ワークシートにオートフィルターを有効にし、ドロップダウン矢印を生成します。
from spire.xls import *
# セクション2で定義した create_sample_workbook() 関数を再利用
def create_sample_workbook():
wb = Workbook()
sheet = wb.Worksheets[0]
sheet.Name = "SalesRecords"
headers = ["OrderID", "Region", "Product", "Salesperson", "Amount", "Status"]
for col, header in enumerate(headers, start=1):
sheet.Range[1, col].Text = header
rows = [
["ORD-1001", "North", "Laptop", "Alice", 1200, "Shipped"],
["ORD-1002", "South", "Phone", "Bob", 800, "Pending"],
["ORD-1003", "East", "Tablet", "Carol", 600, "Shipped"],
["ORD-1004", "South", "Laptop", "David", 1500, "Shipped"],
["ORD-1005", "West", "Phone", "Eve", 900, ""],
["ORD-1006", "North", "Tablet", "Frank", 450, "Cancelled"],
["ORD-1007", "South", "Tablet", "Grace", 700, "Pending"],
["ORD-1008", "East", "Laptop", "Heidi", 1300, "Shipped"],
["ORD-1009", "West", "Laptop", "Ivan", 1100, "Pending"],
["ORD-1010", "North", "Phone", "Judy", 950, "Shipped"],
]
for row_idx, row in enumerate(rows, start=2):
for col_idx, value in enumerate(row, start=1):
if isinstance(value, str):
sheet.Range[row_idx, col_idx].Text = value
else:
sheet.Range[row_idx, col_idx].NumberValue = value
sheet.Range.AutoFitColumns()
return wb, sheet
# 1 サンプルデータを含むワークシートを作成
wb, sheet = create_sample_workbook()
# 2 オートフィルターの範囲をヘッダー行(A1:F1)に設定
sheet.AutoFilters.Range = sheet.Range["A1:F1"]
# 3 ドキュメントを保存
wb.SaveToFile("AutoFilter_Enabled.xlsx", ExcelVersion.Version2013)
wb.Dispose()
print("SalesRecords ワークシートにオートフィルターを有効にしました")
ワークシートプレビュー:
説明:
-
sheet.AutoFilters.RangeはCellRangeオブジェクトを受け取ります。これをヘッダー行A1:F1に設定することで、该行をフィルターの基準とし、各列の上部にフィルターのドロップダウン矢印が表示されます。 - このステップではフィルターのUIを「有効にする」だけで、まだデータ行は非表示になっていません。具体的なフィルター条件は後続のセクションで適用します。
- このパスとフィルター範囲は完全なデータ境界をカバーする必要があります。そうでない場合、一部のデータ行がフィルターロジックに含まれなくなることがあります。
4. テキスト条件でデータをフィルタリングする(CustomFilter)
フィルターを有効にした後、最も一般的なニーズはテキスト内容によるフィルタリングです。たとえば「South地域の全注文のみを表示する」などです。CustomFilterメソッドとワイルドカード*を組み合わせることで、柔軟なテキストマッチングを実現できます。
from spire.xls import *
def create_sample_workbook():
wb = Workbook()
sheet = wb.Worksheets[0]
sheet.Name = "SalesRecords"
headers = ["OrderID", "Region", "Product", "Salesperson", "Amount", "Status"]
for col, header in enumerate(headers, start=1):
sheet.Range[1, col].Text = header
rows = [
["ORD-1001", "North", "Laptop", "Alice", 1200, "Shipped"],
["ORD-1002", "South", "Phone", "Bob", 800, "Pending"],
["ORD-1003", "East", "Tablet", "Carol", 600, "Shipped"],
["ORD-1004", "South", "Laptop", "David", 1500, "Shipped"],
["ORD-1005", "West", "Phone", "Eve", 900, ""],
["ORD-1006", "North", "Tablet", "Frank", 450, "Cancelled"],
["ORD-1007", "South", "Tablet", "Grace", 700, "Pending"],
["ORD-1008", "East", "Laptop", "Heidi", 1300, "Shipped"],
["ORD-1009", "West", "Laptop", "Ivan", 1100, "Pending"],
["ORD-1010", "North", "Phone", "Judy", 950, "Shipped"],
]
for row_idx, row in enumerate(rows, start=2):
for col_idx, value in enumerate(row, start=1):
if isinstance(value, str):
sheet.Range[row_idx, col_idx].Text = value
else:
sheet.Range[row_idx, col_idx].NumberValue = value
sheet.Range.AutoFitColumns()
return wb, sheet
# 1 サンプルデータを含むワークシートを作成
wb, sheet = create_sample_workbook()
# 2 オートフィルターの範囲を設定(ヘッダー + データ)
sheet.AutoFilters.Range = sheet.Range["A1:F11"]
# 3 Region 列(フィルター範囲内で0ベースインデックス1)にテキスト条件 "South*" を適用
filtercolumn = 1
strCrt = String("South*")
sheet.AutoFilters.CustomFilter(filtercolumn, FilterOperatorType.Equal, strCrt)
# 4 フィルターを実行
sheet.AutoFilters.Filter()
# 5 ドキュメントを保存
wb.SaveToFile("AutoFilter_Text.xlsx", ExcelVersion.Version2013)
wb.Dispose()
print("South地域の全注文をフィルタリングしました")
ワークシートプレビュー:
説明:
-
filtercolumnはフィルター列のAutoFilters.Range内での0ベースインデックスを表します。範囲A1:F11において、A=0、B(Region)=1、C=2...となるため、Regionはインデックス1に対応します。 - フィルター条件は
String("South*")として渡されます。*はワイルドカードで、「Southで始まり、その後に任意の文字が続く」ことを意味します。この例ではSouth地域の全3件のレコードがヒットします。 - 条件を設定した後、
sheet.AutoFilters.Filter()を呼び出す必要があります。そうしないと一致しない行が非表示になりません。CustomFilterを設定するだけでは即座には有効になりません。
5. 空白値と非空白値をフィルタリングする(MatchBlanks / MatchNonBlanks)
データクレンジングの際、「重要なフィールドが欠落している」レコードを素早く特定したり、逆に「情報が完全なレコードのみを保持する」必要があります。AutoFiltersは2つの専用メソッドを提供しています:MatchBlanksは空白値をフィルタリングし、MatchNonBlanksは非空白値をフィルタリングします。
from spire.xls import *
def create_sample_workbook():
wb = Workbook()
sheet = wb.Worksheets[0]
sheet.Name = "SalesRecords"
headers = ["OrderID", "Region", "Product", "Salesperson", "Amount", "Status"]
for col, header in enumerate(headers, start=1):
sheet.Range[1, col].Text = header
rows = [
["ORD-1001", "North", "Laptop", "Alice", 1200, "Shipped"],
["ORD-1002", "South", "Phone", "Bob", 800, "Pending"],
["ORD-1003", "East", "Tablet", "Carol", 600, "Shipped"],
["ORD-1004", "South", "Laptop", "David", 1500, "Shipped"],
["ORD-1005", "West", "Phone", "Eve", 900, ""],
["ORD-1006", "North", "Tablet", "Frank", 450, "Cancelled"],
["ORD-1007", "South", "Tablet", "Grace", 700, "Pending"],
["ORD-1008", "East", "Laptop", "Heidi", 1300, "Shipped"],
["ORD-1009", "West", "Laptop", "Ivan", 1100, "Pending"],
["ORD-1010", "North", "Phone", "Judy", 950, "Shipped"],
]
for row_idx, row in enumerate(rows, start=2):
for col_idx, value in enumerate(row, start=1):
if isinstance(value, str):
sheet.Range[row_idx, col_idx].Text = value
else:
sheet.Range[row_idx, col_idx].NumberValue = value
sheet.Range.AutoFitColumns()
return wb, sheet
# 1 サンプルデータを含むワークシートを作成
wb, sheet = create_sample_workbook()
sheet.AutoFilters.Range = sheet.Range["A1:F11"]
# 2 Status 列(0ベースインデックス5)の「非空白」レコードのみを保持
sheet.AutoFilters.MatchNonBlanks(5)
sheet.AutoFilters.Filter()
# 3 ドキュメントを保存
wb.SaveToFile("AutoFilter_NonBlank.xlsx", ExcelVersion.Version2013)
wb.Dispose()
print("Statusフィールドが完全なレコードをフィルタリングしました")
ワークシートプレビュー:
説明:
-
MatchNonBlanks(5)の引数もフィルター範囲内の0ベース列インデックスです。Status列は6列目にあるため、5となります。この例ではステータスが欠落しているORD-1005のレコードが非表示になります。 -
sheet.AutoFilters.MatchBlanks(5)に変更すると、効果は正反対になります——Statusが空白の行のみを保持し、異常データを一括して確認するのに便利です。 -
CustomFilterと同様に、設定後にsheet.AutoFilters.Filter()を呼び出してルールを有効化する必要があります。
6. フィルターをクリアする(Clear)
フィルタリングタスクが完了した後、または同じデータで新しいフィルター条件を試したい場合は、Clearメソッドを呼び出してすべての適用済みフィルターを一括で削除し、元のデータビューに戻すことができます。
from spire.xls import *
def create_sample_workbook():
wb = Workbook()
sheet = wb.Worksheets[0]
sheet.Name = "SalesRecords"
headers = ["OrderID", "Region", "Product", "Salesperson", "Amount", "Status"]
for col, header in enumerate(headers, start=1):
sheet.Range[1, col].Text = header
rows = [
["ORD-1001", "North", "Laptop", "Alice", 1200, "Shipped"],
["ORD-1002", "South", "Phone", "Bob", 800, "Pending"],
["ORD-1003", "East", "Tablet", "Carol", 600, "Shipped"],
["ORD-1004", "South", "Laptop", "David", 1500, "Shipped"],
["ORD-1005", "West", "Phone", "Eve", 900, ""],
["ORD-1006", "North", "Tablet", "Frank", 450, "Cancelled"],
["ORD-1007", "South", "Tablet", "Grace", 700, "Pending"],
["ORD-1008", "East", "Laptop", "Heidi", 1300, "Shipped"],
["ORD-1009", "West", "Laptop", "Ivan", 1100, "Pending"],
["ORD-1010", "North", "Phone", "Judy", 950, "Shipped"],
]
for row_idx, row in enumerate(rows, start=2):
for col_idx, value in enumerate(row, start=1):
if isinstance(value, str):
sheet.Range[row_idx, col_idx].Text = value
else:
sheet.Range[row_idx, col_idx].NumberValue = value
sheet.Range.AutoFitColumns()
return wb, sheet
# 1 サンプルデータを含むワークシートを作成し、フィルターを適用
wb, sheet = create_sample_workbook()
sheet.AutoFilters.Range = sheet.Range["A1:F11"]
sheet.AutoFilters.CustomFilter(1, FilterOperatorType.Equal, String("South*"))
sheet.AutoFilters.Filter()
# 2 すべてのフィルターをクリアし、完全なデータビューを復元
sheet.AutoFilters.Clear()
# 3 ドキュメントを保存
wb.SaveToFile("AutoFilter_Cleared.xlsx", ExcelVersion.Version2013)
wb.Dispose()
print("すべてのフィルター条件をクリアしました")
説明:
-
sheet.AutoFilters.Clear()は現在のワークシートのオートフィルター範囲とすべてのフィルター条件を削除します。条件を変更したい場合は、Rangeと新しいCustomFilterを再設定してFilter()を呼び出すこともできます。 - この操作はフィルタービューにのみ影響し、セルデータは削除されないため、安心して呼び出せます。
7. 重要なクラス、メソッド、プロパティのまとめ
前章では、Free Spire.XLS for Pythonを使用してExcelワークシートのデータフィルタリングを行う方法を段階的に紹介しました。技術的な実装の観点から、フィルタリングのコアプロセスは以下の重要なステップに要約できます。
Python Excelデータフィルタリングステップのまとめ
-
データを準備する
業務データをExcelワークシートに書き込みます。データはヘッダーとデータ行を含み、フォーマットが標準化され、フィルタリング対象として明確な範囲を持つようにします。 -
オートフィルターを有効にする
sheet.AutoFilters.Rangeプロパティを使用して、フィルター対象のセル範囲を設定します。通常はヘッダー行または完全なデータ範囲を指定します。 -
フィルター条件を適用する
CustomFilterメソッドでテキスト条件を、MatchBlanks/MatchNonBlanksメソッドで空白・非空白値の条件を適用します。 -
フィルターを実行する
sheet.AutoFilters.Filter()を呼び出して、設定された条件に基づいて一致しない行を非表示にします。 -
フィルターをクリアする
sheet.AutoFilters.Clear()を使用して、すべてのフィルター条件を削除し、完全なデータビューに戻します。 -
ファイルを保存する
wb.SaveToFile()を使用して、フィルタリング結果を指定したファイルに保存します。
重要なクラス、メソッド、プロパティ
| クラス / メソッド / プロパティ | 説明 |
|---|---|
Workbook |
Excelワークブックオブジェクト、ファイルの作成、読み込み、保存をサポート |
wb.Worksheets[0] |
ワークブックの最初のワークシートを取得 |
sheet.Range[row, col] |
行インデックス(すべて1から開始)でセルにアクセス、テキストや数値の読み書きが可能 |
sheet.Range.AutoFitColumns() |
コンテンツに応じて列幅を自動調整 |
sheet.AutoFilters.Range |
オートフィルターがカバーするセル範囲を設定(通常はヘッダー行または完全なデータ範囲) |
sheet.AutoFilters[index] |
フィルター範囲内の指定列の0ベースインデックスを取得 |
sheet.AutoFilters.CustomFilter(col, op, criteria) |
指定列にカスタムフィルター条件を適用、opはFilterOperatorType演算子 |
FilterOperatorType.Equal |
等号演算子、ワイルドカード文字列と組み合わせて使用されることが多い |
String("...") |
Spireの文字列ラッパー型、*ワイルドカードをサポート(例:"South*") |
sheet.AutoFilters.Filter() |
フィルターを実行し、設定された条件に基づいて一致しない行を非表示にする |
sheet.AutoFilters.MatchBlanks(idx) |
指定列の空白値行をフィルタリング |
sheet.AutoFilters.MatchNonBlanks(idx) |
指定列の非空白値行をフィルタリング |
sheet.AutoFilters.Clear() |
オートフィルター範囲とすべてのフィルター条件をクリア |
ExcelVersion.Version2013 |
保存ファイルのExcelバージョン形式を指定 |
wb.SaveToFile(path, version) |
ワークブックを指定パスに保存 |
wb.Dispose() |
ワークブックが占有していたリソースを解放 |
ベストプラクティス:フィルター列インデックス(
filtercolumn、MatchBlanks/MatchNonBlanksの引数)はすべてAutoFilters.Rangeに対して相対的に計算されます。ワークシートの絶対列番号ではありません。フィルター範囲がA列から始まる場合は両者の数値は同じになりますが、他の列から始まる場合は対応するオフセットが必要です。
これらの重要なクラス、メソッド、プロパティを理解することで、様々なフィルタリング条件を柔軟に組み合わせ、業務ニーズに応じたデータ抽出を効率化できます。これらの技術的詳細を習得することで、実際のプロジェクトで高品質で再現性の高いExcelデータ処理を迅速に実現し、コードを簡潔で保守性の高い状態に保つことができます。
まとめ
本文では、実際の業務データを例として、Free Spire.XLS for Pythonを使用してExcelワークシートでデータフィルタリングを行う方法を段階的に紹介しました。英語のサンプルデータを含むワークシートの作成から始まり、オートフィルターの有効化、テキスト条件でのフィルタリング、空白値・非空白値でのフィルタリング、そしてフィルター条件のクリアまでを順に実装しました。全体の流れで外部ドキュメントに依存する必要はなく、各コードスニペットが独立して実行できるため、定期レポート生成、データクレンジング、品質チェックなどの自動化シーンに簡単に組み込むことができます。
プログラミングによるフィルタリングは、ExcelのUIでドロップダウンをクリックする手動作業と比べて、繰り返しの作業や人為的な見落としを回避できるだけでなく、フィルタールールをバージョン管理可能で再利用可能なスクリプトとして蓄積できます。このスキルを習得することで、データレポートの生成を完全に自動化し、時間を節約し、効率を向上させ、データ分析と意思決定に信頼できるサポートを提供できます。Free Spire.XLSの他の機能(条件付き書式、データ検証、チャート操作など)と組み合わせることで、さらにインテリジェントなExcel自動化ワークフローを作成し、企業のデータ価値を最大化できます。PythonによるExcel操作の詳細については、Spire.XLS for Python公式チュートリアルを参照してください。



