툴곰코드 노트파이썬 › 파이썬으로 엑셀 파일 만들기

파이썬으로 엑셀 파일 만들기

엑셀을 열지 않고 파일을 만듭니다. 매달 같은 표를 손으로 만들고 있다면 이 예제 하나로 그 일이 없어집니다.

⬇ 예제 파일 받기 (.py)
파이썬 · 회원가입 없음
내려받아 python 파일이름.py 로 실행합니다.

무엇을 하는 것인가

xlsx 는 텍스트 파일이 아닙니다. 압축된 형식이라 open()으로는 못 읽습니다. openpyxl 라이브러리를 씁니다. 표준 라이브러리가 아니라 한 번 설치해야 합니다 — pip install openpyxl.

구조는 세 겹입니다. 워크북(파일) 안에 시트가 있고, 시트 안에 셀이 있습니다. Workbook()으로 새 파일을 만들면 시트 하나가 이미 들어 있고, wb.active로 그 시트를 잡습니다.

값을 넣는 방법은 두 가지입니다. ws["A1"] = "월" 처럼 칸 이름으로 넣거나, ws.append([...]) 로 한 줄씩 아래에 붙입니다. 목록을 표로 옮길 때는 append 가 훨씬 편합니다.

수식은 문자열로 넣습니다. ws["B5"] = "=SUM(B2:B4)" 라고 쓰면 엑셀에서 열었을 때 계산됩니다. 다만 openpyxl 은 계산기가 아니라서, 다시 읽으면 계산된 값이 아니라 수식 글자가 나옵니다. 이 차이를 모르면 "왜 숫자가 안 나오지" 하고 한참 헤맵니다.

마지막에 wb.save("이름.xlsx") 를 부르지 않으면 아무 일도 일어나지 않습니다. 저장이 곧 파일 쓰기입니다.

예제 코드

아래 코드가 위 버튼으로 받는 파일과 같은 내용입니다. 통째로 복사해 실행해 보고, 값을 바꿔 가며 결과가 어떻게 달라지는지 보는 편이 읽기만 하는 것보다 훨씬 빨리 익습니다.

# 파이썬으로 엑셀 파일 만들기 — openpyxl
# 설치가 먼저입니다:  pip install openpyxl

from openpyxl import Workbook, load_workbook
from openpyxl.styles import Font, Alignment

매출 = [
    ("1월", 1200000),
    ("2월", 980000),
    ("3월", 1450000),
]

# 1) 워크북(파일) 과 시트 만들기
wb = Workbook()
ws = wb.active          # 새 파일에는 시트가 하나 이미 들어 있습니다
ws.title = "매출"        # 시트 이름은 아래쪽 탭에 보이는 그 이름입니다

# 2) 머리글 — append 는 다음 빈 줄에 한 줄을 붙입니다
ws.append(["월", "매출액"])
for 셀 in ws[1]:
    셀.font = Font(bold=True)
    셀.alignment = Alignment(horizontal="center")

# 3) 데이터
for 월, 금액 in 매출:
    ws.append([월, 금액])

# 4) 합계 — 수식은 문자열로 넣습니다. 계산은 엑셀이 합니다.
마지막 = ws.max_row                     # 지금까지 쓴 마지막 줄 번호
ws.append(["합계", "=SUM(B2:B" + str(마지막) + ")"])
ws.cell(row=마지막 + 1, column=1).font = Font(bold=True)
ws.cell(row=마지막 + 1, column=2).font = Font(bold=True)

# 5) 보기 좋게 — 열 너비와 천 단위 쉼표
ws.column_dimensions["A"].width = 12
ws.column_dimensions["B"].width = 16
for 행 in ws.iter_rows(min_row=2, min_col=2, max_col=2):
    for 셀 in 행:
        셀.number_format = "#,##0"

# 6) 저장 — 이걸 부르지 않으면 파일이 만들어지지 않습니다
wb.save("매출.xlsx")
print("매출.xlsx 를 만들었습니다.")

# 7) 다시 읽기
wb2 = load_workbook("매출.xlsx")
ws2 = wb2["매출"]
print("시트 이름:", wb2.sheetnames)
for 월, 금액 in ws2.iter_rows(min_row=2, max_row=ws2.max_row, values_only=True):
    print(월, 금액)
# 마지막 줄의 금액이 숫자가 아니라 '=SUM(B2:B4)' 로 나옵니다.
# openpyxl 은 수식을 계산하지 않기 때문입니다. 계산된 값이 필요하면
# 엑셀로 한 번 열어 저장한 뒤 load_workbook(파일, data_only=True) 로 읽습니다.

# 8) 합계를 파이썬에서 직접 구해 값으로 넣기 — 수식이 필요 없을 때
합계 = sum(금액 for _, 금액 in 매출)
ws2["B" + str(ws2.max_row)] = 합계
wb2.save("매출_값.xlsx")
print("합계:", format(합계, ","), "원")

기억할 것

자주 묻는 것

ModuleNotFoundError: No module named 'openpyxl' 이 납니다

설치가 안 된 것입니다. 명령 프롬프트에서 pip install openpyxl 을 실행하세요. 그래도 안 되면 python -m pip install openpyxl 로 지금 쓰는 파이썬에 직접 설치합니다.

다시 읽으니 숫자가 아니라 =SUM(B2:B4) 가 나옵니다

openpyxl 은 수식을 계산하지 않습니다. 계산된 값을 읽으려면 엑셀로 한 번 열어 저장한 뒤 load_workbook(파일, data_only=True) 로 읽어야 합니다. 계산 자체를 파이썬에서 하고 싶으면 sum() 으로 구해 값을 넣으세요.

PermissionError 가 납니다

그 파일을 엑셀에서 열어 둔 상태입니다. 엑셀을 닫고 다시 실행하세요. 윈도우는 열려 있는 파일에 덮어쓰기를 막습니다.

한글 열 이름이 깨집니다

xlsx 는 안에서 UTF-8 을 쓰므로 인코딩을 따로 지정할 필요가 없습니다. 깨져 보인다면 파일이 아니라 열어 본 프로그램 쪽 문제입니다.

csv 로 하면 안 되나요

됩니다. 서식이나 수식이 필요 없다면 표준 라이브러리인 csv 모듈이 더 가볍습니다. 굵은 글씨·열 너비·수식이 필요할 때 openpyxl 을 씁니다.

이어서 볼 글