본문 바로가기

코딩/업무자동화

[파이썬/업무자동화] 엑셀에 입력 된 파일명 따라 이미지 삽입하기 - openpyxl

반응형

※ OpenPyxl 관련 포스팅 모음

2021.03.19 - [코딩/업무자동화] - [파이썬/업무자동화] Openpyxl로 엑셀 함수 사용하기, 엑셀 수식 넣기

2021.08.21 - [코딩/업무자동화] - [파이썬/업무자동화] Openpyxl 통해 엑셀 함수 사용하기 2편

2021.08.30 - [코딩/업무자동화] - [파이썬/업무자동화] 엑셀에 입력 된 파일명 따라 이미지 삽입하기 - openpyxl

2021.10.04 - [코딩/업무자동화] - [파이썬/업무자동화] openpyxl.style 사용법 정리

2021.10.16 - [코딩/업무자동화] - [파이썬/업무자동화] openypyxl 통해 엑셀 조건부 서식 적용하기

2021.11.09 - [코딩/업무자동화] - [파이썬/업무자동화] openpyxl 시트 조작 방법 4가지


  이번 업무자동화 포스팅은 엑셀 파일에 이미지를 삽입하는 방법에 대한 것이다. openpyxl 라이브러리는 각 셀에 데이터를 입력하는 것 말고도 이미지를 불러올 수도 있다.

 

 

1. 기본 사용법 : openpyxl 라이브러리의 image 모듈 사용

 

  먼저 기본적인 사용법부터 알아보자. 예시를 들기 위해 그림판으로 숫자 0~9까지 JPG 이미지를 만들어보았다. 사진 크기는 모두 동일하며, 같은 폴더에 위치하고 있다.

 

 

숫자 예시 이미지

 

위 파일 중, 1.jpg 파일을 엑셀파일을 생성해서 이미지를 불러오는 코드를 작성해보자.

 

 

<코드>

#openpyxl import
import openpyxl as op
#이미지 삽입을 위한 openpyxl 모듈의 Image 클래스 import
from openpyxl.drawing.image import Image

#엑셀 파일 및 시트 객체 생성
wb = op.Workbook()
ws = wb.active

#이미지 파일 경로 및 파일명
path = r"C:\Users\Desktop\VS CODE\Project\LoadImage\image"
number_file = "1.jpg"

#Image 클래스의 객체 img 선언 : Image 클래스 선언시 매개변수는 이미지 파일 경로이다.
img = Image(path + "/" + number_file)

#WorkSheet의 add_image 함수 사용 : 매개변수는 각각 Image 객체, 불러올 위치(A1)
ws.add_image(img,"A1")

#저장
wb.save(r"C:\Users\Desktop\VS CODE\Project\LoadImage\결과파일\img_result.xlsx")

 

 

  코드 중 중요한 부분은 img = Image( path+"\"+number_file) 이다. Image 클래스는 openpyxl 의 drawing.image 모듈에 속에 있는 클래스이다. 엑셀에 image를 불러오기 위한 클래스 객체를 선언할 수 있다.

 

  즉, 변수 img는 Image 클래스의 객체(인스턴스)이다. 그리고, Worksheet(코드에서는 ws) 객체의 함수인 add_image를 통해 엑셀 시트에 불러올 수 있다. 말이 어렵지만, 이 설명은 이해하지 못해도 위 코드에서 경로만 수정하여 그대로 사용하면 이미지를 불러오는데 문제는 없다.

 

 

<결과>

1.jpg 불러오기

 

 

  결과를 확인하면 1.jpg 파일을 정상적으로 불러왔지만 한가지 문제가 보인다. 그림의 크기가 엑셀의 셀 크기와 맞지 않는 것이다. 셀의 크기를 설정하기 위해선 엑셀의 행, 열 크기를 지정하는 WorkSheet 함수를 사용하면 된다.  행, 열의 크기를 지정하는 WorkSheet 함수는 column_dimensions와 row_dimensions이다. 사용법은 아래 코드를 참고해보자.

 

 

<코드>

#사용법
ws.column_dimensions[열인덱스(알파벳)].width = 열너비값
ws.row_dimensions[행번호].height = 행너비값

 

 

  이 함수를 사용하려면 엑셀에서 인식하는 그림의 크기를 알아야하는데 아래 이미지처럼 확인해볼 수 있다. 셀의 크기를 이미지랑 비슷하게 설정하여, 행과 열 오른쪽 클릭하여 행너비, 열너비를 확인하면 된다. 아래 그림대로 측정해보면 이미지의 크기는

행*열 = 173.4*37.8이다. 올림해서 174*38이라는 값을 사용할 것이다.

 

 

그림 크기 알기

 

 

  위 숫자를 참고하여 엑셀 파일을 저장하기 전에 코드를 추가해보면 아래와 같다. openpyxl을 import 하는 부분은 생략하고 작성해보았다.

 

 

<코드>

#엑셀 파일 및 시트 객체 생성
wb = op.Workbook()
ws = wb.active

#이미지 파일 경로 및 파일명
path = r"C:\Users\Desktop\VS CODE\Project\LoadImage\image"
number_file = "1.jpg"
#Image 클래스의 객체 img 선언 : Image 클래스 선언시 매개변수는 이미지 파일 경로이다.
img = Image(path + "/" + number_file)

#WorkSheet의 add_image 함수 사용 : 매개변수는 각각 Image 객체, 불러올 위치(A1)
ws.add_image(img,"A1")

ws.column_dimensions['A'].width = 38
ws.row_dimensions[1].height = 174

#저장
wb.save(r"C:\Users\Desktop\VS CODE\Project\LoadImage\결과파일\img_result.xlsx")

 

<결과>

그림 크기에 맞게 셀 크기 지정하기

 

 

반응형

 

 

2. 응용 : 파일명 따라 이미지 삽입하기

 

  응용 부분에서는 아래와 같이 엑셀에 파일명이 입력되어있을 때, 오른쪽 'B'열에 이미지를 모두 불러오는 코드를 작성해보는 것이다. 당연히 셀 크기도 이미지에 맞게 조정되어야 한다. 

 

 

<이미지정보.xlsx> 파일

 

 

<전체코드>

#openpyxl import
import openpyxl as op
#이미지 삽입을 위한 openpyxl 모듈의 Image 클래스 import
from openpyxl.drawing.image import Image

#이미지정보.xlsx 파일 및 시트 객체 생성 함수
def imageLoad(path1, path2):
    wb = op.load_workbook(path1)
    ws = wb.active
 
    row_max = ws.max_row #최대행값 저장
    i=2 #2행부터 시작
    for r in range(2, row_max+1):
        file_name = ws.cell(row=i, column=1).value
        #Image 클래스의 객체 img 선언 : Image 클래스 선언시 매개변수는 이미지 파일 경로이다.
        img = Image(path2 + "/" + file_name)
        ws.add_image(img, "B"+str(i))

        #행마다 행크기 변경
        ws.row_dimensions[i].height = 174
        i=i+1 #1행 아래로 이동

    #Column 크기는 1번만 실행해도 됨(엑셀의 열을 생각해보자.)    
    ws.column_dimensions['B'].width = 38
    wb.save("img_result.xlsx")

if __name__ == "__main__":
    excel_path = r"C:\Users\Desktop\VS CODE\Project\LoadImage\이미지정보.xlsx"
    image_path = r"C:\Users\Desktop\VS CODE\Project\LoadImage\image"
    
    #imageLoad 함수 실행
    imageLoad(excel_path, image_path)

 

 

  코드는 for 반복문을 통해 행마다 파일명 데이터를 읽어온 후, 각 데이터마다 img 객체를 생성해서 image를 불러온 것이다. 1번에서 다뤘던 코드와 크게 다르지 않다. 결과는 아래 image를 확인해보자. image가 커서 중간에 짤렸지만 0~9 이미지를 모두 불러올 수 있다.

 

 

<결과>

행 마다 숫자 이미지 불러오기

728x90