お困りの方へ
Pythonでエクセルの表を作ったら、ヘッダ部分にオートフィルタを設定したいですよね。
自動でオートフィルタを設定する方法を説明します。
エクセルのサンプルデータの作成
サンプルデータとして、エクセルの表を作成します。
以下のコードを実行すると、コードと同じディレクトリにtest.xlsxというファイルが出力されます。
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で設定しています。
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)
上のコードを実行すると、コードと同じディレクトリにtest_autofilter.xlsxというファイルが出力されます。
1行目にオートフィルタの設定ができました。
オートフィルタの範囲を自動にする
ヘッダのカラム数を数えたりせずに、表を作ったらヘッダのエリアを自動で検出できるようにします。
get_column_letter関数を使って、オートフィルタの設定範囲が自動的に変わるように実装しましょう。
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'] # フィルタをかけるエリアを自動算出する。 area = get_column_letter(1) + str(1) + ':' + get_column_letter(ws.max_column) + str(ws.max_row) print(area) # A1:D4 ws.auto_filter.ref = area filename = 'test_autofilter.xlsx' file_path = os.path.join(os.getcwd(), filename) wb.save(file_path)