※ 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 파일을 정상적으로 불러왔지만 한가지 문제가 보인다. 그림의 크기가 엑셀의 셀 크기와 맞지 않는 것이다. 셀의 크기를 설정하기 위해선 엑셀의 행, 열 크기를 지정하는 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'열에 이미지를 모두 불러오는 코드를 작성해보는 것이다. 당연히 셀 크기도 이미지에 맞게 조정되어야 한다.
<전체코드>
#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 이미지를 모두 불러올 수 있다.
<결과>
'코딩 > 업무자동화' 카테고리의 다른 글
[파이썬/업무자동화] openpyxl.style 사용법 정리 (1) | 2021.10.04 |
---|---|
[파이썬/업무자동화] 여러 파일에 이미지 삽입하기 + 이미지 크기 변경(Pillow) (0) | 2021.09.25 |
[파이썬/업무자동화] Openpyxl 통해 엑셀 함수 사용하기 2편 (0) | 2021.08.21 |
[파이썬/업무자동화] 여러개 pdf 파일 1개로 합치기(+엑셀 응용) (2) | 2021.08.10 |
[파이썬/업무자동화] 엑셀 전체 셀 내용 중 특정 문자만 변경/제거하기 (2) | 2021.07.27 |