엑셀에서 자동 필터를 사용해서 정렬하거나 특정 값을 제외하고 보는 경우가 있습니다. openpyxl 필터 추가 방법을 살펴보도록 하겠습니다.
목차
openpyxl 필터 추가 방법: ref 범위 설정
openpyxl에서 필터를 추가하기 위해서는 워크시트의 auto_filter 멤버 변수를 활용하면 됩니다. auto_filter는 AutoFilter 클래스의 인스턴스 객체입니다. 사용 방법에 대해 함께 살펴보겠습니다.
데이터는 3개 컬럼 A, B, C열을 이용하고, 각각 이름, 주소, 나이의 값을 갖습니다(라인 7~9).
데이터는 faker 패키지를 이용해서 가상의 이름, 주소, 그리고 5~95세의 나이값을 임의로 주도록 하였습니다(라인 12).
컬럼 B는 주소가 들어가므로 공간이 필요해서 폭을 50으로 지정했습니다(라인 20).
이제 가장 중요한 필터 추가에 대한 부분입니다.
우선 필터를 사용할 범위를 지정해야 합니다. auto_filter 객체에는 멤버 변수로 ref가 있는데 필터를 적용할 범위를 설정할 때 사용합니다. 따라서 ref에 필터를 사용할 범위를 지정해 줍니다. ref에 작성하는 범위는 엑셀이나 Calc 등 스프레드시트에서 사용하는 “열행:열행”의 형식으로 작성하면 됩니다. 여기에서는 데이터의 개수가 20개, 그리고 첫 행을 제목 줄이므로 A1:C21까지 설정해 주었습니다(라인 22).
여기까지만 해 주면 우선 필터가 생성됩니다.
import random
from faker import Faker
from openpyxl.workbook import Workbook
fake = Faker('ko_KR')
items = [
['이름', '주소', '나이'],
]
for i in range(20):
items.append([fake.name(), fake.address(), random.randint(5, 95)])
wb = Workbook()
ws = wb.active
for item in items:
ws.append(item)
ws.column_dimensions['B'].width = 50
ws.auto_filter.ref = 'A1:C21'
wb.save("filter.xlsx")
wb.close()
Python아래는 위의 코드를 실행했을 때의 결과입니다. 첫째 행에 A, B, C열에 필터 기능이 추가된 것을 확인할 수 있습니다.
여기까지만 필요한 분들은 필터만 추가해 주시면 되겠지만, 보다 자세한 필터 설정이 필요한 경우에는 다음과 같이 필터 컬럼을 추가해 줘야 합니다.
openpyxl 필터 설정 방법: add_filter_column
add_filter_column() 메서드는 세 개의 파라미터를 값으로 받습니다만, 주로 앞의 두 값을 이용하게 됩니다. 첫째 파라미터인 col_id는 필터를 적용할 컬럼의 ID를 의미합니다. A컬럼은 0, B컬럼은 1과 같이 col_id 값은 0부터 시작합니다. 둘째 파라미터는 필터해서 보여줄 값들을 리스트로 넣어주면 됩니다.
add_filter_column(col_id, vals, blank=False)
코드를 통해서 직접 확인해 보겠습니다.
import random
from faker import Faker
from openpyxl.workbook import Workbook
fake = Faker('ko_KR')
items = [
['이름', '좋아하는 과일', '나이'],
['이우진', '사과', 17],
['이도윤', '포도', 19],
['황지후', '포도', 18],
['김정식', '포도', 17],
['이유진', '포도', 18],
['한진우', '사과', 18],
['이미숙', '포도', 17],
['장정웅', '바나나', 17],
['윤민석', '사과', 17],
['이미경', '바나나', 17],
['이성현', '바나나', 18],
['백서준', '포도', 18],
['이현우', '사과', 18],
['송순자', '바나나', 18],
['황현우', '바나나', 19],
['박정순', '바나나', 17],
['김은영', '포도', 19],
['이준영', '바나나', 19],
['이은경', '사과', 19],
['최영자', '포도', 17],
]
wb = Workbook()
ws = wb.active
for item in items:
ws.append(item)
ws.column_dimensions['B'].width = 15
ws.auto_filter.ref = 'A1:C21'
ws.auto_filter.add_filter_column(1, ['바나나'])
wb.save("filter.xlsx")
wb.close()
Python실행한 결과는 아래와 같습니다. col_id를 1로 주었기 때문에 B 컬럼에 바나나 필터가 추가되었습니다. LibreOffice의 Calc에서는 아래와 같이 필터가 추가되면 콤보박스 아이콘의 색상이 반전되며 우측 하단에 네모난 점이 표시됩니다.
하지만 바나나만 필터로 했음에도 필터링이 되지 않았습니다. 이것은 openpyxl 공식 문서에서도 설명하듯이 필터와 관련된 지침이 추가는 되어도 실제로 필터링하지 않기 때문입니다. 따라서 필터를 적용하는 것은 Excel이나 Calc와 같은 스프레드시트에서 직접 적용해 주셔야 합니다.
정리
간략히 openpyxl 필터 추가 및 설정 방법을 함께 살펴보았습니다. openpyxl에서는 필요한 필터의 세팅만 해 두고, 엑셀 파일을 열어서 사용하는 사용자가 직접 필터를 적용해 줘야 한다는 점 꼭 기억해 두시기 바랍니다.
관련 자료
openpyxl의 Using filters and sorts 페이지를 참고했습니다.