Recent Posts
Recent Comments
Archives
Today
Total
05-21 00:42
관리 메뉴

이것저것 잡동사니

[예제 코드] openpyxl 기초 사용법 완벽 정리 본문

컴퓨터공학/예제 코드

[예제 코드] openpyxl 기초 사용법 완벽 정리

Park Siyoung 2023. 10. 23. 23:48
반응형

openpyxl은 파이썬을 사용해 엑셀 파일을 작성하거나 읽을 수 있도록 해주는 패키지다. 나는 크롤링 등으로 수집한 데이터를 정리할 때 주로 사용한다. 처음 사용하거나 오랜만에 사용하는 경우 제대로 헤메는 경우가 많기 때문에 짧은 예제 코드를 통해 기본적인 기능을 정리해놓으려고 한다.

 

openpyxl 버전 : 3.1.2 (2023-10-23 기준)

 

주의 ★

1. 엑셀 파일의 행 번호는 1부터 시작한다

2. 엑셀 파일의 열 문자는 'A'부터 시작한다

3. 빈 셀의 값은 None이다 (빈 문자열 ''이 아님)

 

예제1) Workbook와 worksheet 생성/삭제, 데이터 쓰기, workbook 저장

from openpyxl import Workbook

# Workbook(엑셀 파일) 생성
# 이때, 'Sheet'라는 이름의 worksheet가 기본적으로 생성된다
wb = Workbook()

# Worksheet 생성
ws1 = wb.create_sheet('new_sheet_1')
ws2 = wb.create_sheet('new_sheet_2')

# 기본으로 생성되는 worksheet 삭제
del wb['Sheet']

# Worksheet들의 이름을 리스트 자료형으로 얻을 수 있다
sheet_names = wb.sheetnames

# Worksheet의 이름을 사용해 해당 worksheet를 사용할 수 있다
ws = wb['new_sheet_2']

# A1셀에 문자열 쓰기
ws['A1'] = 'Hello, World!'

# Workbook 저장
wb.save('example.xlsx')
wb.close()

example.xlsx 내용

 

반응형

 

예제2) Workbook의 값 읽기

from openpyxl import load_workbook

# Workbook 로드하기
wb = load_workbook('example.xlsx')

# Worksheet 객체 얻기
ws = wb['new_sheet_2']

# 'A1'셀의 값 읽어서 출력하기
text = ws['A1'].value
print(text)

wb.close()

출력 결과

 

예제3) 특정 위치에 데이터 쓰기/특정 위치의 데이터 읽기

from openpyxl import Workbook
from openpyxl.utils import get_column_letter
from openpyxl.utils.cell import coordinate_from_string
from openpyxl.utils.cell import column_index_from_string

wb = Workbook()
ws = wb['Sheet']

# 'A1'셀에 값 쓰기
ws['A1'] = 'Apple'

# 두 번째 열 첫 번째 행 ('B1')에 값 쓰기
ws[get_column_letter(2) + '1'] = 'Banana'

# 'A1'셀의 값 읽기
str1 = ws['A1'].value

# 'B1'셀의 값 읽기
str2 = ws[get_column_letter(2) + '1'].value

print(str1, str2)

# 문자열 위치를 행과 열으로 분리하기
coord = coordinate_from_string('A2')  # ('A', 2)

# 열 문자를 숫자 인덱스로 변환하기
col_idx = column_index_from_string('C')  # 3

print(coord, col_idx)

wb.save('example2.xlsx')
wb.close()

실행 결과
example2.xlsx

 

예제4) 행 높이 / 열 너비 지정하기

※ 주의 : 너비와 높이의 단위가 다르다 (같은 값을 넣어도 너비가 6배 정도 길게 나온다)

from openpyxl import Workbook

wb = Workbook()
ws = wb['Sheet']

# 열 너비 지정하기 (10=약 120픽셀)
ws.column_dimensions['A'].width = 16

# 행 높이 지정하기 (10=20픽셀)
ws.row_dimensions[1].height = 100

wb.save('example3.xlsx')
wb.close()

example3.xlsx

 

비례식을 사용해 다음과 같은 함수를 만들면 픽셀 단위로 치수를 설정할 수 있다.

def set_row_height_in_pixel(worksheet, row, height):
    worksheet.row_dimensions[row].height = height * 10 / 20

def set_col_width_in_pixel(worksheet, col, width):
    worksheet.column_dimensions[col].width = width * 10 / 120
    
set_row_height_in_pixel(ws, 1, 120)  # 1행의 높이를 120픽셀으로
set_col_width_in_pixel(ws, 'A', 120)  # A열의 너비를 120픽셀으로

 

반응형

 

예제5) 이미지 URL을 사용한 그림 삽입

from openpyxl import Workbook
from openpyxl.drawing.image import Image

import urllib3
import io


def get_image(http, url, width, height):
    img = Image(io.BytesIO(http.request('GET', url).data))
    img.width = width * 10 / 15
    img.height = height * 10 / 15

    return img


def set_row_height_in_pixel(worksheet, row, height):
    worksheet.row_dimensions[row].height = height * 10 / 20


def set_col_width_in_pixel(worksheet, col, width):
    worksheet.column_dimensions[col].width = width * 10 / 120


http = urllib3.PoolManager()

wb = Workbook()
ws = wb['Sheet']

set_row_height_in_pixel(ws, 1, 120)
set_col_width_in_pixel(ws, 'A', 120)

img_url = 'https://이미지URL'
# 'A1' 위치에 120x120px 크기로 이미지 삽입
ws.add_image(get_image(http, img_url, 120, 120), anchor='A1')

wb.save('example4.xlsx')
wb.close()

example4.xlsx

 

반응형
Comments