OpenPyXLでエクセルのオートフィルタ設定をしたい

TAGS :

エクセルのオートフィルタをOpenPyXLで設定したい

OpenPyXLで表を作ったら、ヘッダのところにオートフィルタを設定したいですよね。
やってみましょう。
OpenPyXLのドキュメントは こちら です。

まずは、下記コードでエクセルの表を作成します。

Python

import openpyxl
import os

data = {
    'Ken' : { 'Country': 'US', 'Job': 'Artist', 'Age': 56 },
    'Alan' : { 'Country': 'Japan', 'Job': 'Carpenter', 'Age': 27 },
    'Steven' : { 'Country': 'China', 'Job': 'Artist', 'Age': 40 }
}

wb = openpyxl.Workbook()
ws = wb.create_sheet(title='test')

headers = ['Name'] + list(data[list(data.keys())[0]].keys())
for header in headers:
    col = headers.index(header) + 1
    ws.cell(row=1, column=col).value = header
row = 2
for name in data:
    ws.cell(row=row, column=1).value = name
    for header in data[name]:
        col = headers.index(header) + 1
        ws.cell(row=row, column=col).value = data[name][header]
    row += 1

filename = 'test.xlsx'
file_path = os.path.join(os.getcwd(), filename)
wb.remove(wb['Sheet'])
wb.save(file_path)

このようなエクセルの表ができます。
エクセルの表

OpenPyXLでエクセルのオートフィルタしたい範囲を設定するだけ

OpenPyXLのオートフィルタ設定は簡単で、範囲を設定するだけです。
オートフィルタ範囲は ws.auto_filter.ref で設定します。
ws.auto_filter.ref = "A1:D4"

Python

import os
import openpyxl
from openpyxl.utils import get_column_letter, column_index_from_string

filename = 'test.xlsx'
file_path = os.path.join(os.getcwd(), filename)
wb = openpyxl.load_workbook(file_path)
ws = wb['test']

ws.auto_filter.ref = "A1:D4"

filename = 'test_autofilter.xlsx'
file_path = os.path.join(os.getcwd(), filename)
wb.save(file_path)

上記コードを実行した結果です。セル横にプルダウンボタンが出現して、オートフィルタが設定できています。
オートフィルタ設定後のエクセルの表

どんな大きさの表にも対応できるように、get_column_letter() などを使って、オートフィルタの設定範囲が自動的に変わるように実装すると、さらにいいかもしれません。


from openpyxl.utils import get_column_letter, column_index_from_string
ws.auto_filter.ref = get_column_letter(1) + str(1) + ':' + get_column_letter(ws.max_column) + str(ws.max_row)