실행 환경
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['시트이름']