파이썬 서드파티 라이브러리인 openpyxl과 xlsxwriter를 이용해 마이크로소프트 오피스의 엑셀 파일을 다루는 파이썬 프로그래밍
엑셀은 윈도우 운영체제에서 인기 있는 강력한 스프레드시트 프로그램으로, 앞서 배운 텍스트 형식의 CSV 파일과는 다르게 바이너리(binary) 형식의 파일이다.
엑셀 파일은 워크북(workbook)이라고 하는데, 워크북은 하나 이상의 워크시트(worksheets)를 포함하므로 엑셀 파일을 스프레드시트(spreadsheets)라고도 한다. 스프레드시트는 열과 행, 즉 셀(cell)로 이루어진 표 형식의 데이터를 조작, 분석, 저장하는 애플리케이션을 의미한다.
엑셀로는 데이터를 생성하고 수식을 사용하여 각종 통꼐 및 분석 기능 수행하거나 차트 그리기, 데이터의 일부를 선택하거나 편집하는 등의 다양한 작업을 수행할 수 있다. 다음과 같은 라이브러리를 사용하면 엑셀로 할 수 있는 작업들을 파이썬 프로그램에서도 자유롭게 할 수 있다.
openpyxl은 엑셀과 관련된 XLSX, XLSM, XLTX,XLTM 파일을 읽고 쓰기 위한 파이썬 라이브러리이다. 엑셀 통합 문서 작성, 문서 읽기, 수식, 셀 병합, 이미지 삽입, 데이터 분석 라이브러리인 판다스(pandas)와의 연계, 차트 삽입, 피벗 테이블, 필터 및 정렬 등의 다양한 기능을 제공한다. openpyxl은 라이브러리명과 모듈명이 동일하다.
pip show openpyxl
pip show 명령어로 라이브러리 기본 정보, 버전, 홈페이지, 의존성 라이브러리 등을 확인할 수 있다.
openpyxl 모듈을 사용하는 방법
1. 모듈을 임포트한다.
import openpyxl
workbook = openpyxl.load_workbook('file.xlsx')
# 워크북에 존재하는 모든 시트의 정보를 가져온다.
workbook.sheetnames
# 주어진 시트 이름의 워크시트 객체를 가져와서 worksheet 변수에 할당한다.
worksheet = workbook['sheet_name']
worksheet.cell(row=3, column=2)
== B3
엑셀은 1부터 시작함

import openpyxl
# openpyxl warning이 뜨는 것들이 있음
import warnings
warnings.simplefilter('ignore')
# warnings 메세지 무시하겠다.
workbook = openpyxl.load_workbook('common.xlsx')
print('워크북 내의 워크시트 :', workbook.sheetnames)
print('=' * 30)
# 고객 이름의 워크시트 가져오기
customer = workbook['고객']
# 셀 객체 읽기
print('첫번째 셀 객체 :', customer['A1'])
print('첫번째 셀 객체의 값 :', customer['A1'].value)
print('3행 2열 셀 :', customer.cell(row=3, column=2))
print('3행 2열 셀 :', customer.cell(row=3, column=2).value)
print('이름 :', customer['B3'].value, customer['C3'].value)
출력 결과
워크북 내의 워크시트 : ['common', '고객', '상품']
==============================
첫번째 셀 객체 : <Cell '고객'.A1>
첫번째 셀 객체의 값 : 번호
3행 2열 셀 : <Cell '고객'.B3>
3행 2열 셀 : 이
이름 : 이 순신
xlsxwriter는 엑셀 파일을 생성하고 내용을 기록할 때 사용하는 파이썬 라이브러리이다. 엑셀 파일에 텍스트와 이미지, 차트, 수식, 하이퍼링크 등을 삽입할 수 있고 데이터 분석용 라이브러리인 pandas 모듈과의 연동, 필터, 조건부 서식 등의 기능을 지원한다. xlsxwriter는 라이브러리명과 모듈명이 동일하다.
1. 모듈을 임포트한다.
import xlsxwriter
workbook = xlsxwriter.Wrokbook('file_name.xlsx')
worksheet = workbook.add_worksheet()
worksheet.write('A1', '안녕')
worksheet.write(0, 0, '안녕')
workbook.close()
import xlsxwriter
workbook = xlsxwriter.Workbook('result_excel_write.xlsx')
worksheet = workbook.add_worksheet()
items = [
['홍길동', 100],
['신사임당', 200],
['이순신', 300],
['장보고', 400]
]
row = 0
col = 0
for item, cost in items :
worksheet.write(row, col, item)
worksheet.write(row, col+1, cost)
row += 1
# 마지막 행에 TOTAL
worksheet.write(row, 0, 'Total')
worksheet.write(row, 1, '=SUM(B1:B4)')
workbook.close()

xlsxwriter를 사용하면 기본적인 읽기와 쓰기 외에도 데이터의 표준편차, 로그, 다른 작업 간의 추세 파악 같은 엑셀 시트가 지원하는 수많은 작업을 수행할 수 있다. 특히 수식을 사용하여 다양한 연산을 수행할 수 있고, 차트를 생성할 수도 있다.
앞에서 write() 메소드에 문자열 형태로 '=SUM(B1:B4)'처럼 수식을 입력해봤는데, worksheet 객체의 write_formula() 메소드를 통해서도 문자열로 수식을 사용할 수 있다.
worksheet.write(row, 1, '=SUM(B1:B4)')
worksheet.write_formula('A1', '=SUM(1, 2, 3)')
또한, write_formula() 메소드에는 지정된 셀에 수식 또는 함수 등을 사용할 수 있다.
worksheet.write_formula(0, 0, '=B3 + B4')
worksheet.write_formula(2, 0, '=SUM(B1:B5)')
worksheet.write_formula('A5', '=AVERAGE(1, 2, 3, 4)')
xlsxwriter 모듈로는 선형 차트(line, chart), 막대 차트(bar chart), 파이 차트(pie chart) 등 다양한 형태의 차트도 그릴 수 있다.
차트를 그릴 때는 add_chart(), add_series(), insert_chart() 메소드를 사용한다.
1. workbook 객체의 add_chart() 메소드를 사용하여 차트 유형 만든다. 매개변수에는 딕셔너리 형태로 차트의 형태를 전달한다.
chart = workbook.add_chart({'type' : 'line'})
chart.add_series({'values' : '=Sheet1!$A$1:$A$6'})
add_series() 메소드에 설정할 수 있는 주요 속성
chart.add_series({
'categories' : 'Sheet1!$A$1:$A$5',
'values' : 'Sheet1!$B$1:$B$5',
'line' : {'color' : 'red'}
})
chart.add_series({
'categories' : ['Sheet1', 0, 0, 4, 0],
'values' : ['Sheet1', 0, 1, 4, 1],
'line' : {'color' : 'red'}
})
worksheet.insert_chart('C1', chart)
chart = workbook.add_chart({'type' : 'line'})
chart.add_series({'values' : '=Sheet1!$A$1:$A$5'})
chart.add_series({
'categories' : 'Sheet1!$A$1:$A$5',
'values' : 'Sheet1!$B$1:$B$5',
'line' : {'color' : 'red'}
})
worksheet.insert_chart('C1', chart)
close() 이전에 코드 추가

파이썬을 이용해 엑셀로 데이터를 분석하는 케이스 스터디를 진행해보자. 우리는 회사의 최근 4년간 내부 현황을 비교하여 엑셀 시트에 차트로 시각화해야 한다. 년도, 수익, 매출 원가, 이익으로 구성된 데이터는 파이썬의 리스트 형태로 제공되며, 엑셀 수식을 사용하여 백분율로 순수익을 계산하는 업무를 파이썬으로 실행한다.
import xlsxwriter
# Workbook 객체를 생성하고 워크시트를 추가
workbook = xlsxwriter.Workbook('result_case.xlsx')
worksheet = workbook.add_worksheet()
# bar chart 추가
chart = workbook.add_chart({'type' : 'bar'})
# 2차원 리스트 형태로 데이터 제공
items = [
['년도', '2022', '2023', '2024', '2025'],
['수익', 3000, 5000, 5500, 6000],
['매출 원가', 1500, 3000, 2000, 3000],
['이익', 1500, 2000, 3500, 3000]
]
# write_row() -> 행 단위로 write
row = len(items)
for r in range(row) :
worksheet.write_row('A' + str(r+1), items[r])
# worksheet.write_row('A1', items[0]) ['년도', '2022', '2023', '2024', '2025']
# 차트에 데이터 추가
# 리스트로 입력할 값들을 만들어둔다.
series_datas = ['=Sheet1!$B$2:$B$4' # 3000, 1500, 1500 2022년도 데이터
,'=Sheet1!$C$2:$C$4' # 2023
,'=Sheet1!$D$2:$D$4' # 2024
,'=Sheet1!$E$2:$E$4'] # 2025
# items 첫번째 행의 열의 개수 : 5
first_row = len(items[0])
for r in range(first_row) :
# 첫번째 열이 다 한글임 열 건너뛰기
if r == 0 :
continue
chart.add_series({'values': series_datas[r-1], 'name': items[0][r]})
# series_datas 는 0부터 가져와야함
# names 범례
# chart.add_series({'values' : '=Sheet1!$B$2:$B$4', 'name' : '2022'})
worksheet.insert_chart('A8', chart)
# 수식으로 증가율 추가
formulas = ['증가율', '=(B4/B2)*100'
, '=(C4/C2)*100'
, '=(D4/D2)*100'
, '=(E4/E2)*100']
col = 0
for formula in formulas :
worksheet.write(5, col, formula)
col += 1
workbook.close()
엑셀 파일 확인
