Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬 openpyxl로 엑셀 차트 만드는 방법 – 단계별 완벽 가이드


이 글에서는 파이썬(Python)의 openpyxl 모듈을 사용해 엑셀에서 차트를 만드는 방법을 소개합니다. 테니스 선수들의 그랜드슬램 우승 횟수를 데이터로 삼아, 빈 상태에서 엑셀 스프레드시트를 새로 만들고 막대그래프(Bar Chart)까지 완성하는 전 과정을 단계별로 살펴보겠습니다.

소개

마이크로소프트 오피스는 2007 버전부터 엑셀 파일에 .xlsx 확장자를 도입해 더 많은 행과 열을 저장할 수 있게 했습니다. 이 변화로 엑셀 시트는 ZIP 압축이 적용된 XML 기반 파일 형식으로 전환되었습니다. 오늘날 전 세계에서 마이크로소프트 스프레드시트는 다양한 용도로 활용되고 있으며, 그중 대표적인 사례가 바로 데이터 시각화입니다.

준비하기

파이썬의 xlrd 모듈은 openpyxl의 대안으로 엑셀 형식 지원이 우수하지만, 읽기 작업만 수행할 수 있다는 한계가 있습니다. 반면 openpyxl 모듈은 엑셀 시트에 대해 읽기와 쓰기를 모두 처리할 수 있어 차트 생성과 같은 쓰기 작업에 적합합니다.

구현 방법

1) openpyxl 설치

먼저 아래 명령어로 openpyxl 모듈을 설치합니다.

pip install openpyxl

2) 데이터 정의

새 엑셀 스프레드시트에 담을 데이터를 정의합니다.

# 모듈 임포트
import openpyxl

# 파일 이름과 데이터 정의
file_name = "charts.xlsx"
file_data = (['player', 'titles'],
             ['Federer', 20],
             ['Nadal', 20],
             ['Djokovic', 17],
             ['Murray', 3])

3) 새 엑셀 파일 생성

새 엑셀 파일을 만들면 기본 시트인 'Sheet'가 자동으로 생성됩니다.

xlsxfile = openpyxl.Workbook()
print(f" *** The sheets inside the excel_file are = {xlsxfile.sheetnames}")
new_workbook = xlsxfile['Sheet']
*** The sheets inside the excel_file are = ['Sheet']

4) 시트에 데이터 입력

테니스 선수 이름과 그랜드슬램 우승 횟수를 시트에 추가합니다.

for row, (player, titles) in enumerate(file_data, 1):
    new_workbook['A{}'.format(row)].value = player
    new_workbook['B{}'.format(row)].value = titles

5) 파일 저장

입력한 데이터를 file_name 파일로 저장합니다.

xlsxfile.save(file_name)

6) 파일 불러오기 및 시트 목록 확인

파일을 메모리로 불러온 뒤 모든 시트를 나열합니다. 앞서 시트를 하나만 만들었으므로 목록에는 'Sheet' 하나만 표시됩니다.

import openpyxl

excel_file_data = openpyxl.load_workbook(file_name)
excel_file_data.sheetnames
['Sheet']

7) 셀 값 읽기

첫 번째 시트를 가져온 후 A2, B2 셀의 값을 확인합니다.

sheet_values = excel_file_data['Sheet']
print(f" *** One of the value from the sheet is - {sheet_values['A2'].value} - {sheet_values['B2'].value}")
*** One of the value from the sheet is - Federer - 20

8) 전체 데이터 출력

스프레드시트의 모든 행과 열을 출력해 차트용 데이터가 올바르게 들어갔는지 점검합니다.

for row in sheet_values:
    for cell in row:
        print(cell.value)
player
titles
Federer
20
Nadal
20
Djokovic
17
Murray
3

9) 차트 객체 생성

openpyxl.chart에서 BarChart와 Reference를 임포트한 뒤 막대그래프 객체를 만듭니다.

from openpyxl.chart import BarChart, Reference

chart = BarChart()

10) 차트 기본 정보 설정

차트 제목, 축 제목 등 기본 정보를 입력합니다.

chart.title = "Players & Grand Slams"
chart.y_axis.title = 'Titles'
chart.x_axis.title = 'Tennis Players'

11) 데이터 참조 및 추가

데이터 범위에 대한 참조를 만들어 차트에 추가합니다.

data = Reference(sheet_values, min_row=2, max_row=5, min_col=1, max_col=2)
chart.add_data(data, from_rows=True, titles_from_data=True)

12) 차트 삽입 및 저장

마지막으로 차트를 시트에 추가하고 파일을 저장합니다.

new_workbook.add_chart(chart, "A6")
xlsxfile.save(file_name)

11단계에서는 Reference 객체를 통해 2행 1열부터 5행 2열까지의 참조 범위를 생성합니다. 이 범위가 바로 데이터가 있는 영역이며, 헤더 행은 제외됩니다.

데이터는 .add_data() 메서드로 차트에 추가됩니다. from_rows 옵션은 각 행을 서로 다른 데이터 계열(series)로 만들고, titles_from_data 옵션은 첫 번째 열의 값을 계열 이름으로 사용합니다.

전체 예제 코드

지금까지 설명한 내용을 하나로 합친 전체 코드입니다.

"""
Program : Create charts in excel using Python with openpyxl
params  : NA
output  : charts.xlsx 파일에 테니스 선수 그랜드슬램 우승 데이터와
          막대그래프 차트를 함께 저장
"""
# 모듈 임포트
import openpyxl

# 파일 이름과 데이터 정의
file_name = "charts.xlsx"
file_data = (['player', 'titles'],
             ['Federer', 20],
             ['Nadal', 20],
             ['Djokovic', 17],
             ['Murray', 3])

# 엑셀 스프레드시트 생성
xlsxfile = openpyxl.Workbook()
print(f" *** The sheets inside the excel_file are = {xlsxfile.sheetnames}")
new_workbook = xlsxfile['Sheet']

# 데이터 입력
for row, (player, titles) in enumerate(file_data, 1):
    new_workbook['A{}'.format(row)].value = player
    new_workbook['B{}'.format(row)].value = titles

# 스프레드시트 저장
xlsxfile.save(file_name)

# 데이터 읽기
excel_file_data = openpyxl.load_workbook(file_name)
excel_file_data.sheetnames

sheet_values = excel_file_data['Sheet']
print(f" *** One of the value from the sheet is - {sheet_values['A2'].value} - {sheet_values['B2'].value}")

for row in sheet_values:
    for cell in row:
        print(cell.value)

# openpyxl.chart로 막대그래프 생성
from openpyxl.chart import BarChart, Reference
chart = BarChart()

# 차트 제목 등 기본 정보 입력
chart.title = "Players & Grand Slams"
chart.y_axis.title = 'Titles'
chart.x_axis.title = 'Tennis Players'

# 데이터 참조를 만들어 차트에 추가
data = Reference(sheet_values, min_row=2, max_row=5, min_col=1, max_col=2)
chart.add_data(data, from_rows=True, titles_from_data=True)

# 차트를 시트에 추가하고 파일 저장
new_workbook.add_chart(chart, "A6")
xlsxfile.save(file_name)
*** The sheets inside the excel_file are = ['Sheet']
*** One of the value from the sheet is - Federer - 20
player
titles
Federer
20
Nadal
20
Djokovic
17
Murray
3

실행 결과

위 프로그램을 실행하면 코드 파일과 같은 디렉터리에 charts.xlsx 파일이 생성되며, 아래와 같은 막대그래프가 포함됩니다.

파이썬 openpyxl로 엑셀 차트 만드는 방법 – 단계별 완벽 가이드