이번 업무자동화 포스팅은 여러 엑셀 파일에 동일한 이미지를 삽입하는 방법에 대해 포스팅한다. 이전에 파일명에 따라 이미지를 엑셀에 불러오는 업무자동화 포스팅을 작성한 적이 있다. 관심있는 사람은 아래 링크를 참고
2021.08.30 - [코딩/업무자동화] - [파이썬/업무자동화] 엑셀에 입력 된 파일명 따라 이미지 삽입하기 - openpyxl
여러 파일에 이미지를 삽입하는 방법을 포스팅하기 전에 이미지의 크기를 변경할 수 있는 라이브러리가 있어 사용법을 정리해본다. PIL (Python Image Library)라는 라이브러리이다. 이 라이브러리를 사용하면 이미지를 수정할 수 있다.
1. PIL 사용법 (이미지 크기 조절)
먼저 이미지 크기를 조절하는 방법에 대해 알아보도록 하자. 이번에 연습할 대상으로 아래 이미지를 사용할 것이다. 파일명은 "cat_and_piano.jpg"이다.
이미지의 크기는 1036*698로 확인할 수 있다.
1) image 크기 읽어오기
먼저 PIL을 통해 이미지의 크기를 읽어오도록 해보자.
<코드>
from PIL import Image
#image 경로
img_path = r"C:\Users\VS CODE\Project\13. 여러 파일에 이미지 한번에 삽입\pilllow 연습\cat_and_piano.JPG"
#img 객체 생성
img = Image.open(img_path)
#img 사이즈 출력
print("이미지의 크기 : ", img.size)
<결과>
결과는 가로,세로 크기가 튜플로 출력된다.
이미지의 크기 : (1036, 689)
2) image 크기 조절하기(resize)
image의 크기는 resize 메서드를 통해 수정할 수 있다. 1036*689의 크기를 800*430으로 수정해보도록 하자.
<코드>
#img 객체 생성
img = Image.open(img_path)
#img 객체를 resize 후 새로운 객체 생성
resize_image = img.resize((800,430))
#수정 후 이미지 크기 출력
print("수정 후 이미지크기 : ", resize_image.size)
<결과>
수정 후 이미지크기 : (800, 430)
3) 수정 한 이미지 저장하기(save)
수정 한 이미지는 객체의 save 함수를 통해 저장할 수 있다. 아래 .save 함수의 사용법을 참고해보자.
#image 저장 ~~~.save(저장할 경로 및 파일명, 이미지 저장 형태, 이미지 품질) |
<코드>
#이미지 resize
resize_image = img.resize((800,430))
#resize한 이미지 저장
resize_image.save(save_path, "JPEG", quality=95)
<결과>
2. 여러 파일에 이미지 삽입하기
이번 포스팅의 주제는 한 폴더에 여러 엑셀파일(동일 양식)이 있을 경우 한번에 이미지를 삽입하는 코드를 작성하는 것이다. 테스트를 위해 아래 빈 엑셀 파일 4개를 생성하였다.
이미지는 1번에서 다뤘던 "cat_and_piano.jpg"파일을 삽입할 것이다.
1) Import
<코드>
import os
import openpyxl as op
#엑셀 이미지 삽입을 위한 openpyxl import
from openpyxl.drawing.image import Image
#openpyxl Image 클래스와 중복되므로 PIL은 pi로 설정
from PIL import Image as pi
필요한 라이브러리 및 모듈을 import하였다. 주의할 점은 openpyxl.drawing.image 모듈에서 제공하는 Image 클래스와 PIL에서 제공하는 Image 클래스의 명칭이 똑같아서 PIL을 pi로 바꿔서 사용하도록 변경하였다.
2) 함수 설명
함수명 | 매개변수 | 설명 |
resizeImage | size, image_path, img_name | -. 이미지의 사이즈를 조절하는 함수 정의 -. size : 이미지를 조절할 사이즈 -. image_path : image가 있는 원본 위치(절대 경로 또는 상대경로) -. img_name : image 파일명 |
insertImage | file_path, img_path, img_name, save_path | -. 이미지를 엑셀파일 설정 시트 "A1"에 불러오는 함수 정의 -. file_path : 엑셀파일이 있는 경로 -. img_path, img_name : 위와 동일 -. save_path : 결과파일을 저장할 경로 |
3) 함수 구현
<코드>
#사이즈를 조절하는 함수
def resizeImg(size, img_path, img_name):
#이미지 객체 생성
img = pi.open(img_path+"/"+img_name)
#이미지 resize
resize_img = img.resize(size)
#수정한 이미지 저장
resize_img.save(img_path+"/"+img_name, "JPEG", quality=95)
#이미지를 엑셀에 삽입하는 함수
def insertImg(file_path, img_path, img_name, save_path):
#file_path 폴더에 파일 목록을 리스트화
file_list = os.listdir(file_path)
#리스트 for문 실행
for file in file_list:
#각 파일 openpyxl Workbook 객체 생성
wb = op.load_workbook(file_path+"/"+file)
#시트 설정
ws = wb.active
#이미지 객체 생성
img = Image(img_path+"/"+img_name)
#이미지를 "A1"에 추가
ws.add_image(img, "A1")
#엑셀 파일 저장
wb.save(save_path+"/"+file)
4) 실행부
<코드>
if __name__ == "__main__":
#엑셀파일 PATH
file_path = r"C:\Users\Desktop\VS CODE\Project\13. 여러 파일에 이미지 한번에 삽입\새 폴더"
#불러올 이미지 파일 PATH
img_path = r"C:\Users\Desktop\VS CODE\Project\13. 여러 파일에 이미지 한번에 삽입"
#결과파일을 저장할 PATH
save_path = r"C:\Users\Desktop\VS CODE\Project\13. 여러 파일에 이미지 한번에 삽입\결과파일저장"
#이미지파일명
img_name = "cat_and_piano.JPG"
#조절할 사이즈(500*200)
size = (500,200)
#함수 호출
resizeImg(size, img_path, img_name)
insertImg(file_path, img_path, img_name, save_path)
5) 결과
각 엑셀 파일에 사이즈가 조절 된 이미지가 삽입된 것을 확인할 수 있다.
'코딩 > 업무자동화' 카테고리의 다른 글
[파이썬/업무자동화] openypyxl 통해 엑셀 조건부 서식 적용하기 (0) | 2021.10.16 |
---|---|
[파이썬/업무자동화] openpyxl.style 사용법 정리 (1) | 2021.10.04 |
[파이썬/업무자동화] 엑셀에 입력 된 파일명 따라 이미지 삽입하기 - openpyxl (4) | 2021.08.30 |
[파이썬/업무자동화] Openpyxl 통해 엑셀 함수 사용하기 2편 (0) | 2021.08.21 |
[파이썬/업무자동화] 여러개 pdf 파일 1개로 합치기(+엑셀 응용) (2) | 2021.08.10 |