Korean (한국어) translation by Dae-yeop Lee (you can also view the original English article)
지금까지 여러분은 때때로 마이크로소프트 엑셀을 사용해 오셨을 것입니다. 엑셀은 스프레드시트, 표, 차트 등을 다룰 때 굉장히 강력합니다. 그런데 파이썬과 무슨 관계가 있을까요?
파이썬은 엑셀 관련 작업에서 발생할 수 있는 처리하기 곤란한 일들을 자동화할 수 있기 때문에 엑셀 파일을 처리하는 방식에 큰 변화를 가져올 수 있습니다. 예를 들어, 회사 예산에 관련된 수백 개의 스프레드시트에서 특정 정보를 찾아야 할 수 있습니다. 굉장히 곤란한 일이지 않을까요? 이 튜토리얼에서는 파이썬을 이용해 엑셀 문서 작업을 손쉽게 수행하는 방법을 보여드리겠습니다.
참, 컴퓨터에 마이크로소프트 엑셀이 설치돼 있지 않아도 걱정할 필요는 없습니다. 이번 튜토리얼을 진행하는 데는 LibreOffice Calc나 OpenOffice Calc 같은 대체재를 사용하셔도 됩니다.
그럼 시작해 봅시다!
OpenPyXL
OpenPyXL
은 엑셀 2010의 xlsx/xlsm/xltx/xltm
파일을 읽고 쓰는 데 사용하는 라이브러리입니다. 이번 튜토리얼에서는 엑셀 문서를 처리하는 데 이 라이브러리를 사용할 것입니다.
이 라이브러리를 사용하기 위해 맨 먼저 해야 할 일은 OpenPyXL
을 설치하는 것입니다.
OpenPyXL 설치
OpenPyXL
을 설치하기 위해 여기서는 pip를 사용할 것입니다(위키피디아 참조).
파이썬으로 작성된 소프트웨어 패키지의 설치 및 관리에 사용되는 패키지 관리 시스템. 파이썬 패키지 인덱스(PyPI; Python Package Index)에서 각종 패키지를 찾을 수 있다.
pip
를 설치하기 위해서는 파이썬 패키징 사용자 가이드(Python Packaging User Guide)에 언급된 단계를 따라할 수도 있지만 시스템에 설치된 파이썬 버전이 파이썬 2.7.9
이상 또는 파이썬 3.4
이상인 경우 이미 pip
가 설치돼 있을 것입니다!
이제 (맥 OS X의 터미널에서) 다음 명령을 입력해서 OpenPyXL을 간단히 설치할 수 있습니다.
pip install openpyxl
엑셀 문서 열기
OpenPyXL
을 설치하고 나면 엑셀 문서를 처리할 준비가 끝났습니다. 엑셀 문서를 대상으로 가장 먼저 해볼 작업은 해당 문서를 여는 것입니다. 튜토리얼을 실습하기 위해 sample.xlsx 엑셀 파일을 내려받거나 직접 엑셀 파일을 준비해도 됩니다.
OpenPyXL
을 사용하려면 먼저 다음과 같이 OpenPyXL
을 임포트해야 합니다.
import openpyxl
엑셀 문서를 여는 데 필요한 메서드는 load_workbook()
입니다. 통합 문서(workbook)가 무슨 뜻인지 궁금하실 수 있는데 단순히 엑셀 스프레드시트 문서일 뿐입니다. 엑셀 문서를 여는 데 필요한 스크립트는 다음과 같습니다.
1 |
import openpyxl |
2 |
excel_document = openpyxl.load_workbook('sample.xlsx') |
이제 load_workbook() 메서드에서 반환한 타입을 봅시다. 다음과 같이 하면 됩니다.
print type(excel_document)
그럼 다음과 같은 내용이 출력됩니다.
1 |
<class 'openpyxl.workbook.workbook.Workbook'> |
보다시피 반환된 객체는 workbook
이라는 데이터 타입인 Workbook
입니다. 여기서 Workbook
객체가 엑셀 파일을 나타냅니다.
시트 이름
엑셀의 시트(Sheet)는 열(A, B, C 등으로 시작하는 문자가 적힌)과 행(1, 2, 3 등으로 시작하는)으로 구성됩니다. 엑셀 문서에 어떤 시트가 들어있는지 확인하려면 다음과 같이 get_sheet_names()
메서드를 사용합니다.
excel_document.get_sheet_names()
위의 명령을 print
하면 다음과 같은 결과가 출력됩니다.
[u'Sheet1']
즉, Sheet1
이라는 시트 하나가 있음을 보여줍니다.
시트가 여러 개 있는 경우 get_sheet_by_name()
메서드를 사용해 이름으로 특정 시트에 접근할 수 있습니다.
셀에 접근하기
이제 엑셀 파일을 열고 시트를 가져오는 방법을 배웠으므로 시트에 있는 셀에 얼마나 쉽게 접근할 수 있는지 확인해 봅시다. 그러려면 해당 시트를 검색한 다음 셀의 위치(좌표)를 지정하기만 하면 됩니다. 엑셀 문서에서 A
열 2
행, 즉 A2
에 접근하고 싶다고 해봅시다. 이를 다음과 같이 구현할 수 있습니다.
1 |
sheet = excel_document.get_sheet_by_name('Sheet1') |
2 |
print sheet['A2'].value |
이 경우 Abder
라는 값이 반환됩니다.
행-열 표기법을 사용할 수도 있습니다. 예를 들어, 5
행 2
열에 위치한 셀에 접근하고 싶을 경우 다음과 같이 입력하면 됩니다.
sheet.cell(row = 5, column = 2).value
이 경우 programmer
가 출력됩니다.
셀을 나타내는 객체 타입을 보고 싶다면 다음과 같이 입력하면 됩니다.
print type(sheet['A2'])
또는
print sheet.cell(row = 5, column = 2)
이 경우 다음과 같은 결과가 출력됩니다.
<class 'openpyxl.cell.cell.Cell'>
이는 해당 객체의 타입이 Cell
이라는 뜻입니다.
셀의 범위에 접근하기
단 하나의 셀이 아니라 여러 셀에 접근하고 싶다면 어떻게 해야 할까요? 엑셀 문서에서 A1
에서 B3
까지의 셀에 접근하고 싶다고 해봅시다.



이는 다음과 같은 스크립트로 할 수 있습니다.
1 |
multiple_cells = sheet['A1':'B3'] |
2 |
for row in multiple_cells: |
3 |
for cell in row: |
4 |
print cell.value |
이 경우 다음과 같은 결과가 출력됩니다.
1 |
Name
|
2 |
Profession
|
3 |
Abder
|
4 |
Student
|
5 |
Bob
|
6 |
Engineer
|
모든 행과 열에 접근하기
OpenPyXL
을 이용하면 rows()
와 columns()
메서드를 각각 사용해 엑셀 문서의 모든 행과 열에 접근할 수 있습니다.
모든 행에 접근하기 위해서는 다음과 같이 하면 됩니다.
1 |
all_rows = sheet.rows |
2 |
print all_rows[:] |
모든 행에 접근하는 데 [:] 표기법을 사용했다는 것을 눈여겨보세요. 이는 whole_document
에서 반환된 객체의 타입이 튜플(tuple)
이기 때문입니다.
위 스크립트의 출력 결과는 다음과 같을 것입니다.
1 |
((<Cell Sheet1.A1>, <Cell Sheet1.B1>), (<Cell Sheet1.A2>, <Cell Sheet1.B2>), (<Cell Sheet1.A3>, <Cell Sheet1.B3>), (<Cell Sheet1.A4>, <Cell Sheet1.B4>), (<Cell Sheet1.A5>, <Cell Sheet1.B5>), (<Cell Sheet1.A6>, <Cell Sheet1.B6>), (<Cell Sheet1.A7>, <Cell Sheet1.B7>)) |
반면 모든 열에 접근하려면 다음과 같이 하면 됩니다.
1 |
all_columns = sheet.columns |
2 |
print all_columns[:] |
어느 경우든 다음과 같은 결과가 출력될 것입니다.
1 |
((<Cell Sheet1.A1>, <Cell Sheet1.A2>, <Cell Sheet1.A3>, <Cell Sheet1.A4>, <Cell Sheet1.A5>, <Cell Sheet1.A6>, <Cell Sheet1.A7>), (<Cell Sheet1.B1>, <Cell Sheet1.B2>, <Cell Sheet1.B3>, <Cell Sheet1.B4>, <Cell Sheet1.B5>, <Cell Sheet1.B6>, <Cell Sheet1.B7>)) |
물론 OpenPyXL 문서에서 볼 수 있듯이 엑셀 문서로 할 수있는 일은 더 많습니다.
결론
이 튜토리얼에서는 파이썬을 이용해 엑셀 문서를 처리하는 것이 얼마나 유연한지 알아봤습니다. 튜토리얼의 초반부에 언급했던 시나리오를 기억하십니까? 프로젝트로 해볼 만한 가치가 있을 겁니다!