엑셀 매크로(VBA) 보안 경고 끝! 파이썬으로 똑같은 작업 대체하기
이전 게시글 엑셀 데이터 차트 이미지 자동 저장 편에서는 차트를 PNG 이미지로 만드는 방법을 소개했습니다. 이미지는 보고서에 붙여넣기 좋지만, 데이터가 바뀌면 차트를 다시 그려야 합니다. 이번 글에서는 엑셀 파일 안에 진짜로 살아있는 차트를 자동으로 삽입하는 방법을 소개합니다. 엑셀에서 직접 열어보면 일반적으로 차트 마법사로 만든 것과 똑같이 더블클릭해서 수정하거나 데이터 범위를 바꿀 수 있습니다.
파이썬이 설치되어 있어야 합니다. 없다면 python.org에서 최신 버전을 받아 설치하세요. 설치 시 반드시 "Add Python to PATH"에 체크해야 합니다.
터미널(윈도우: CMD 또는 파워셸)을 열고 아래 명령어를 실행하세요:
pip install openpyxl pandas
openpyxl은 엑셀 파일 안에 네이티브 차트 객체를 직접 생성하는 기능을 지원합니다. matplotlib처럼 이미지를 그리는 것이 아니라, 엑셀이 인식하는 진짜 차트 데이터를 만듭니다. pandas는 원본 데이터를 읽는 데 사용합니다.
💡 이 코드로 만들 수 있는 차트: 막대 차트, 꺾은선 차트, 원형 차트, 영역 차트를 자동으로 생성하고 한 시트에 여러 차트를 배치해 대시보드 형태로 구성할 수 있습니다. 엑셀에서 더블클릭하면 차트 종류·색상·데이터 범위를 직접 수정할 수 있습니다.
아래처럼 1행이 헤더이고 2행부터 데이터가 입력된 형태면 됩니다.
월 매출 비용 순이익 1월 5,200,000 3,100,000 2,100,000 2월 6,800,000 3,500,000 3,300,000 3월 4,900,000 2,900,000 2,000,000 4월 7,400,000 4,100,000 3,300,000
아래 코드를 그대로 복사해서 메모장에 붙여넣고, excel_dashboard.py로 저장하세요. 저장 시 파일 형식은 "모든 파일", 인코딩은 UTF-8로 설정합니다.
from openpyxl import load_workbook
from openpyxl.chart import BarChart, LineChart, PieChart, Reference
from openpyxl.chart.label import DataLabelList
import pandas as pd
from pathlib import Path
# ① 설정
INPUT_PATH = r"C:\Users\내이름\Desktop\월별매출.xlsx" # ← 원본 데이터 엑셀
OUTPUT_PATH = r"C:\Users\내이름\Desktop\대시보드.xlsx" # ← 결과 저장 경로
SHEET_NAME = "데이터" # ← 데이터가 있는 시트명
# ② 데이터를 시트에 쓰기 (없으면 새로 작성)
df = pd.read_excel(INPUT_PATH, engine="openpyxl")
print(f" ✔ 데이터 로드 완료: {len(df)}행")
with pd.ExcelWriter(OUTPUT_PATH, engine="openpyxl") as writer:
df.to_excel(writer, sheet_name=SHEET_NAME, index=False)
# ③ 저장된 파일을 다시 열어 차트 삽입
wb = load_workbook(OUTPUT_PATH)
ws = wb[SHEET_NAME]
max_row = ws.max_row
max_col = ws.max_column
# ④ 막대 차트: 월별 매출·비용·순이익 비교
bar_chart = BarChart()
bar_chart.title = "월별 매출·비용·순이익"
bar_chart.style = 10
bar_chart.x_axis.title = "월"
bar_chart.y_axis.title = "금액(원)"
bar_chart.width = 18
bar_chart.height = 10
data = Reference(ws, min_col=2, max_col=max_col, min_row=1, max_row=max_row)
cats = Reference(ws, min_col=1, min_row=2, max_row=max_row)
bar_chart.add_data(data, titles_from_data=True)
bar_chart.set_categories(cats)
ws.add_chart(bar_chart, "F2") # F2 셀 위치에 차트 삽입
print(f" ✔ 막대 차트 삽입 완료")
# ⑤ 꺾은선 차트: 순이익 추이
line_chart = LineChart()
line_chart.title = "순이익 추이"
line_chart.style = 12
line_chart.x_axis.title = "월"
line_chart.y_axis.title = "순이익(원)"
line_chart.width = 18
line_chart.height = 10
profit_data = Reference(ws, min_col=4, max_col=4, min_row=1, max_row=max_row)
line_chart.add_data(profit_data, titles_from_data=True)
line_chart.set_categories(cats)
ws.add_chart(line_chart, "F22") # 막대 차트 아래쪽에 배치
print(f" ✔ 꺾은선 차트 삽입 완료")
# ⑥ 원형 차트: 항목별 비율 (마지막 행 기준 매출·비용·순이익 비율)
pie_chart = PieChart()
pie_chart.title = "최근 월 매출 구성"
pie_chart.width = 12
pie_chart.height = 10
pie_data = Reference(ws, min_col=2, max_col=4, min_row=max_row, max_row=max_row)
pie_labels = Reference(ws, min_col=2, max_col=4, min_row=1, max_row=1)
pie_chart.add_data(pie_data, titles_from_data=False)
pie_chart.set_categories(pie_labels)
pie_chart.dataLabels = DataLabelList()
pie_chart.dataLabels.showPercent = True
ws.add_chart(pie_chart, "P2") # 막대 차트 옆쪽에 배치
print(f" ✔ 원형 차트 삽입 완료")
# ⑦ 저장
wb.save(OUTPUT_PATH)
print(f"\n✅ 완료! 대시보드 저장 → {OUTPUT_PATH}")
INPUT_PATH에 원본 데이터 엑셀 경로를 입력합니다.OUTPUT_PATH에 차트가 삽입된 결과를 저장할 경로를 입력합니다.min_col, max_col 값을 본인 데이터에 맞게 조정합니다.python excel_dashboard.py
정상 실행 시 터미널에 이렇게 출력됩니다:
✔ 데이터 로드 완료: 4행 ✔ 막대 차트 삽입 완료 ✔ 꺾은선 차트 삽입 완료 ✔ 원형 차트 삽입 완료 ✅ 완료! 대시보드 저장 → C:\Users\내이름\Desktop\대시보드.xlsx
결과 파일을 엑셀에서 열면 데이터 표 옆에 막대·꺾은선·원형 차트 3개가 자동으로 배치되어 있습니다. 차트를 더블클릭하면 일반 엑셀 차트처럼 색상, 종류, 범례를 직접 수정할 수 있습니다.
오류 1: 차트가 빈 화면으로 나오거나 데이터가 표시 안 됨
Reference의 min_row, max_row, min_col, max_col이 실제 데이터 범위와 다른 경우입니다. ws.max_row와 ws.max_column 값을 출력해서 실제 데이터 크기를 먼저 확인하세요.
오류 2: 차트가 표 데이터를 가리며 겹쳐서 표시됨
ws.add_chart(chart, "F2")의 위치 셀 주소가 데이터 영역과 겹치는 경우입니다. 데이터가 A~D열까지 있다면 F열 이후로 차트를 배치해야 겹치지 않습니다.
오류 3: 한글 차트 제목이 깨짐
openpyxl은 한글을 기본 지원하므로 거의 발생하지 않습니다. 만약 깨진다면 코드 파일 저장 시 인코딩이 UTF-8인지 다시 확인하세요.
차트의 색상이나 범례 위치를 세밀하게 조정할 수 있습니다.
from openpyxl.chart.legend import Legend from openpyxl.drawing.colors import ColorChoice # 범례를 차트 하단에 배치 bar_chart.legend.position = "b" # t=상단, b=하단, l=좌측, r=우측 # 막대 색상을 시리즈별로 지정 bar_chart.series[0].graphicalProperties.solidFill = "4A90D9" # 매출: 블루 bar_chart.series[1].graphicalProperties.solidFill = "E84C3D" # 비용: 레드 bar_chart.series[2].graphicalProperties.solidFill = "2ECC71" # 순이익: 그린
💡 이전 게시글과 결합하면: 피벗 테이블 자동 생성 편으로 만든 집계 데이터를 이 코드로 차트화하면 데이터 가공부터 시각화까지 완전 자동화된 보고서를 만들 수 있고, 이메일 자동 발송 편과 결합하면 대시보드 파일을 자동으로 발송할 수 있습니다.
이 코드를 응용하면 영역 차트, 콤보 차트(막대+꺾은선), 스파크라인을 추가하는 것도 가능합니다.