openpyxl로 Excel 파일 처리하기

실행 환경

Windows 10
Python 3.10
openpyxl 3.1.2
이 글은 openpyxl 공식 문서를 참고하여 작성되었습니다.

openpyxl이란?

Excel 2010 버전 이상의 xlsx/xlsm 파일을 읽고 쓰기 위한 Python 라이브러리입니다.

기본 사용 예시

Excel 파일에 데이터 쓰기

from openpyxl import Workbook

# 새 워크북 생성
workbook = Workbook()
worksheet = workbook.active

# 셀에 값 쓰기
worksheet['A1'] = '이름'
worksheet['B1'] = '나이'
worksheet['A2'] = '홍길동'
worksheet['B2'] = 25

# 파일 저장
workbook.save('output.xlsx')

Excel 파일에서 데이터 읽기

from openpyxl import load_workbook

# 기존 파일 열기
workbook = load_workbook('output.xlsx')
worksheet = workbook.active

# 셀 값 읽기
print(worksheet['A1'].value)  # 이름
print(worksheet['B1'].value)  # 나이

워크북과 워크시트 관리

워크북 생성

from openpyxl import Workbook

wb = Workbook()

워크북은 하나의 Excel 파일을 의미합니다. 모든 워크북에는 최소 하나의 워크시트가 포함되어 있으며, Excel 파일을 열면 기본으로 하나의 시트가 생성됩니다.

# 활성 시트 가져오기
ws = wb.active

# 새 워크시트 생성
ws1 = wb.create_sheet("테스트시트")  # 마지막에 추가

# 특정 위치에 워크시트 생성
ws2 = wb.create_sheet("첫번째시트", 0)  # 맨 앞에 삽입
ws3 = wb.create_sheet("뒤에서두번째", -1)  # 끝에서 두 번째 위치

# 워크시트 이름 변경
ws2.title = '새이름'

# 모든 워크시트 이름 목록 가져오기
print(wb.sheetnames)

# 특정 이름의 워크시트 접근
ws = wb['새이름']

# 모든 워크시트 순회
for sheet in wb:
    print(sheet.title)

셀 접근 방법

Excel 파일이 다음과 같은 데이터를 가지고 있다고 가정합니다:

from openpyxl import load_workbook

wb = load_workbook('sample.xlsx')
sheet = wb['table']

# 좌표로 셀 접근
cell = sheet['A1']
print(cell.value)  # 셀 값 출력

# 값 설정 (셀 없으면 자동 생성)
sheet['A1'] = '컬럼1'

#另一种 방법: cell() 함수 사용
sheet.cell(row=1, column=2, value='컬럼2')

참고: openpyxl에서 행과 열의 번호는 1부터 시작합니다.

여러 셀 접근

셀 범위 지정

# A1부터 E1까지의 범위
cell_range = sheet['A1':'E1']

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

행/열 단위 접근

# 특정 행 전체
row1 = sheet[1]

# 행 범위
rows = sheet[1:3]

# 특정 열 전체
col_a = sheet['A']

# 열 범위
cols = sheet['A':'B']

반복자로 접근

# 행 방향으로 반복
for row in sheet.iter_rows(min_row=1, max_row=2, min_col=1, max_col=2):
    for cell in row:
        print(cell.value)

# 열 방향으로 반복
for col in sheet.iter_cols(min_row=1, max_row=2, min_col=1, max_col=2):
    for cell in col:
        print(cell.value)

# 값만 가져오기
for row in sheet.iter_rows(min_row=1, max_col=3, max_row=2, values_only=True):
    print(row)

워크시트 전체 접근

# 행 순서대로 모든 셀
for row in sheet.rows:
    print(row)

# 열 순서대로 모든 셀
for col in sheet.columns:
    print(col)

# 값만 가져오기
for row in sheet.values:
    print(row)

행과 열 크기 정보

# 최대 행 수
max_row = sheet.max_row

# 최대 열 수
max_col = sheet.max_column

파일 저장

디스크에 저장

wb = Workbook()
# 데이터 수정 작업...
wb.save('result.xlsx')

스트림으로 저장 (웹 애플리케이션용)

Pyramid, Flask, Django 등 웹 프레임워크에서 사용할 때:

from tempfile import NamedTemporaryFile
from openpyxl import Workbook

wb = Workbook()
with NamedTemporaryFile() as tmp:
    wb.save(tmp.name)
    tmp.seek(0)
    stream_data = tmp.read()

파일에서 데이터 읽기

from openpyxl import load_workbook

# 기존 Excel 파일 읽기
wb = load_workbook('existing_file.xlsx')

# 시트 접근
ws = wb.active
# 또는 특정 시트 이름으로 접근
ws = wb['시트이름']

태그: openpyxl python Excel data-processing file-handling

6월 6일 21:42에 게시됨