본문 바로가기
프로그래밍/엑셀(Excel)

Openpyxl을 이용하여 엑셀(Excel) 셀 안에 이미지(Image) 삽입하기

by 부자 꽁냥이 2023. 1. 14.

파이썬(Python)을 이용하면 엑셀 파일에서 셀 안에 이미지를 삽입할 수 있다. Openpyxl을 사용하면 가능한데 이번 포스팅에서는 Openpyxl을 이용하여 엑셀(Excel) 셀 안에 이미지(Image)를 삽입하는 방법을 알아본다.


   셀 안에 이미지(Image) 삽입하기

1) 한 개 이미지 삽입

우선 한 개 이미지 삽입하는 방법을 알아보자. 방법은 간단하다. 이미지를 삽입하고 이미지 픽셀을 엑셀(Excel)의 셀 사이즈 단위로 변환하여 그에 맞게 셀 폭과 높이를 변경하면 된다.

 

아래 코드는 하나의 이미지를 삽입하는 작업을 수행한다. 이때 이미지 사이즈는 픽셀 단위로 500X281이다. 여기서 핵심은 바로 get_col_width_row_height 함수인데 이 함수가 이미지 사이즈를 픽셀 단위에서 엑셀 셀 폭과 행 단위로 바꿔준다. 함수 내부에 사용한 숫자들은 내가 실험을 통하여 적정 숫자를 선정한 것이며 실험은 Excel 2016 기준으로 진행한 것이다.

 

import os

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

def get_col_width_row_height(img_width, img_height):
    col_width = img_width*63.2/504.19
    row_height = img_height*225.35/298.96
    return (col_width, row_height)

wb = Workbook() ## 워크북 생성
ws = wb.active ## 첫 번째 시트

## 이미지 불러오기
image_path = './images/a.png'
image = Image(image_path)

ws.add_image(image, 'A1') ## 이미지 삽입

## 이미지 픽셀을 셀 폭과 높이로 변환
col_width, row_height = get_col_width_row_height(image.width, image.height)

ws.column_dimensions['A'].width = col_width ## 셀 폭 변경
ws.row_dimensions[1].height = row_height ## 셀 높이 변경

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

 

저장한 엑셀 파일을 열어보면 아래와 같이 이미지가 삽입되었으며 셀 폭과 높이가 이미지 사이즈에 맞게 변경되었다.

 


2) 여러 개 이미지 삽입하기

이번엔 앞에서 배운 것을 응용해 보자. 여기서는 폴더에 5개의 이미지를 삽입한다. 각 이미지의 사이즈는 픽셀 단위로 500X281로 동일하다. 이때 이미지는 두 번째 칼럼에서 행 아래 방향으로 추가한다. 또한 첫 번째 칼럼에는 이미지 경로값을 입력하도록 한다.

 

아래 코드가 우리가 원하는 작업을 해준다. 설명은 앞에서 배운 것과 거의 흡사하므로 주석을 참고하기 바란다.

 

wb = Workbook() ## 워크북 생성
ws = wb.active ## 첫 번째 시트

img_dir = './images'
img_file_list = os.listdir(img_dir) ## 이미지 파일 리스트

for i, img_file in enumerate(img_file_list):
    image_path = os.path.join(img_dir, img_file) ## 이미지 경로
    image = Image(image_path) ## 이미지 로드
    ws.add_image(image, anchor='B'+str(i+1)) ## 이미지 삽입
    col_width, row_height = get_col_width_row_height(image.width, image.height) ## 엑셀 셀 폭 높이 단위
    if i==0:
        ws.column_dimensions['B'].width = col_width ## 셀 폭은 한 번만 변경
    ws.row_dimensions[i+1].height = row_height ## 셀 높이 변경
    ws.cell(row=i+1, column=1, value=img_file) ## 첫 번째 칼럼에 이미지 경로 입력

wb.save('multiple_images.xlsx')

 

이미지를 열어보면 다음과 같이 여러 이미지가 자연스럽게 삽입된 것을 알 수 있다(아래가 조금 짤렸다).

 


댓글


맨 위로