본문 바로가기

코딩/업무자동화

[파이썬/업무자동화] 엑셀 파일 시트별 pdf 저장/변환하기

반응형

1편 : 2021.06.21 - [코딩/업무자동화] - [파이썬/업무자동화] 엑셀 파일 시트별 pdf 저장/변환하기

2편 : 2021.08.10 - [코딩/업무자동화] - [파이썬/업무자동화] 여러개 pdf 파일 1개로 합치기(+엑셀 응용)

 

 내 티스토리 블로그 유입 경로에 '엑셀 시트별 pdf 저장하기'라는 기능을 찾는 분이 계셔서 이번 포스팅을 진행한다. 1개 엑셀파일이 아닌 한 폴더의 다수 엑셀파일의 각각 시트를 pdf로 저장하는 파이썬 코드이다. 실제 내가 하는 업무 중 에도 엑셀파일에 자료를 작성하고 pdf 파일로 만들어 배포하는 업무가 있다. 해당 코드를 사용하면 귀찮은 업무를 조금 덜 수 있지 않을까 싶다.

 

  코드를 테스트하기 위해 아래 가상의 엑셀파일 4개를 만들어보았다. 각각의 엑셀파일에는 임의의 이름을 가진 3개의 시트명을 생성했다.

 

<엑셀 파일 4개 임의 생성>

 

<엑셀 파일 중 투손플레이스 블로그.xlsx 파일 시트 3개>

 

아래 컨셉으로 기능을 구현할 것이다.

 

-. 각 블로그 엑셀파일의 파일경로, 파일명, 시트명을 모두 저장

-. 각 파일의 모든 시트를 파일명+시트명의 이름을 가진 pdf 파일로 저장하기

 

 

먼저 엑셀파일을 pdf로 저장하는 코드를 작성하려면 모듈 중 win32com.client를 설치하고 사용법을 익혀야 한다. win32com.client는 이전에 아웃룩 메일 자동화 포스팅에서도 다룬적이 있다.

(참고링크 :2021.04.28 - [코딩/업무자동화] - [파이썬/업무자동화] Outlook 메일 첨부 엑셀파일의 내용 자동 취합하기)

 

 

 

1. win32com.client 사용

 

 

1) pywin32 설치

 

 

win32com.client를 사용하기 위해선 pywin32 모듈을 설치하면 된다. 터미널 창에 아래 명령여 입력

(작성자는 VS Code를 사용한다.)

 

pip install pywin32

 

pywin32를 설치하는 방법은 구글링을 통해 정보를 많이 찾아볼 수 있으니 여기서 자세한 설명은 생략한다.

 

 

2) 사용법

 

  win32com.client를 사용하여 엑셀파일을 pdf로 변환하는 방법을 아래 간단하게 설명하였다. 해당 내용은 '아무튼 워라벨'이라는 사이트에서 참고하여 작성한다. 하단에 첨부링크 첨부한다. 설명은 주석으로 대신한다.

 

 

<코드>

#win32com.client 모듈 임포트
import win32com.client

#엑셀을 실행할 객체 생성
excel = win32com.client.Dispatch("Excel.Application")

#pdf로 변환할 파일명 선택
wb = excel.Workbooks.Open(r".\Project\pdf_transform\새 폴더\test.xlsx")

#워크북의 시트명 설정
ws_sht = wb.Worksheets("Sheet1")
#설정한 시트 선택
ws_sht.Select()

#PDF파일을 저장할 경로 및 파일명 지정
savepath = r".\Project\pdf_transform\새 폴더\결과.pdf"

#활성화된 시트를 pdf 저장
wb.ActiveSheet.ExportAsFixedFormat(0, savepath)

# 엑셀 워크북 및 프로그램 종료
# 종료를 제대로 해주어야 다음 실행시 에러 안생김
wb.Close(False)
excel.Quit()

 

<결과>

 

 

 

-. 엑셀파일에 있는 'Sheet1'이 '결과.pdf'로 저장되었다.

-. 비어있는 Sheet인 경우 에러가 발생하는 것 같다.

-. pdf로 변환할 시트는 인쇄 영역 설정이 된 부분만 변환된다.(영역 설정이 안되면 제대로 변환이 안됨)

 

 

 

 

2. 여러 엑셀 파일 각 시트를 pdf 변환하기 - 함수 구현

 

 

  함수는 2가지로 구현하였다. 엑셀의 파일명, 경로, 시트 정보를 읽어오는 excelInfo와 PDF 로 실제 변환을 수행하는 transPDF이다.

 

 

1) 모듈 import

 

 

  모듈은 크게 3가지를 사용한다. 엑셀파일을 pdf로 변환하기 위한 win32com.client 모듈, 엑셀 내부 시트 정보를 읽어오기 위한 openpyxl, 그리고 파일 경로를 다루기 위한 os 모듈이다.

 

 

<코드>

import win32com.client
import openpyxl as op
import os

 

 

2) excelInfo 구현

 

-. excelInfo는 엑셀파일이 있는 경로를 입력받아 파일명, 경로, 시트명을 리스트로 받아 리턴한다.

-. filepath는 엑셀파일이 있는 경로를 나타내는 매개변수이다.

 

 

<코드>

def excelInfo(filepath):

    excel_list = os.listdir(filepath) #폴더안에 잇는 엑셀파일 명을 리스트로 저장
    result = [] #빈 리스트 생성
   
    for file in excel_list: #엑셀파일명 리스트를 for문을 통해 반복
        wb = op.load_workbook(filepath+"/"+file) #openpyxl workbook 생성
        ws_list = wb.sheetnames #해당 workbook의 시트명을 리스트로 받음
        filename = file.replace(".xlsx","") #파일명을 저장하기 위해 문자열에서 확장자 제거
       
       for sht in ws_list: #시트명 리스트를 for문을 통해 반복
            temp_tuple = (filepath+"/"+file, filename, sht) #파일경로, 파일명, sht를 튜플에 저장
            result.append(temp_tuple) #위 튜플을 빈 리스트에 추가
    print(result) #결과 출력
    return result # 튜플로 이루어진 리스트 리턴

 

 

 

3) transPDF

 

-. excelInfo 함수에서 리턴받은 리스트를 입력받는다.(fileinfo)

-. savepath는 pdf 저장할 경로이다.

 

 

<코드>


def transPDF(fileinfo, savepath):

    excel = win32com.client.Dispatch("Excel.Application")
    i=0 #파일명 중복을 방지하기 위한 인덱싱 번호
    
    #excelinfo를 입력받아 for문 실행
    for info in fileinfo:
        wb = excel.Workbooks.Open(info[0]) #info가 튜플이므로 인덱싱으로 접근(0번째는 파일경로)
        ws = wb.Worksheets(info[2]) #튜플의 2번째 요소는 시트명임. 

        ws.Select() #위 설정한 시트 선택
        wb.ActiveSheet.ExportAsFixedFormat(0, savepath+"/"+str(i)+"_"+info[1]+"_"+info[2]+".pdf") #파일명, 시트명으로 pdf 저장
        i=i+1
        wb.Close(False) #workbook 닫기, True일 경우 그 상태를 저장한다.
        excel.Quit()  # excel application 닫기

 

 

<결과>

<프로그램 실행과정 - 이미지를 클릭하면 확인 가능 >

 

<결과 pdf 파일 생성 이미지>

 

 

3. 전체 코드 및 파일 첨부

 

 

<전체코드>

import win32com.client
import openpyxl as op
import os


def excelInfo(filepath):
    excel_list = os.listdir(filepath) #폴더안에 잇는 엑셀파일 명을 리스트로 저장
    result = [] #빈 리스트 생성
    for file in excel_list: #엑셀파일명 리스트를 for문을 통해 반복
        wb = op.load_workbook(filepath+"/"+file) #openpyxl workbook 생성
        ws_list = wb.sheetnames #해당 workbook의 시트명을 리스트로 받음
        filename = file.replace(".xlsx","") #파일명을 저장하기 위해 문자열에서 확장자 제거
        for sht in ws_list: #시트명 리스트를 for문을 통해 반복
            temp_tuple = (filepath+"/"+file, filename, sht) #파일경로, 파일명, sht를 튜플에 저장
            result.append(temp_tuple) #위 튜플을 빈 리스트에 추가
    print(result)
    return result # 튜플로 이루어진 리스트 리턴


def transPDF(fileinfo, savepath):

    excel = win32com.client.Dispatch("Excel.Application")
    i=0 #파일명 중복을 방지하기 위한 인덱싱 번호
    
    #excelinfo를 입력받아 for문 실행
    for info in fileinfo:
        wb = excel.Workbooks.Open(info[0]) #info가 튜플이므로 인덱싱으로 접근(0번째는 파일경로)
        ws = wb.Worksheets(info[2]) #튜플의 2번째 요소는 시트명임. 

        ws.Select() #위 설정한 시트 선택
        wb.ActiveSheet.ExportAsFixedFormat(0, savepath+"/"+str(i)+"_"+info[1]+"_"+info[2]+".pdf") #파일명, 시트명으로 pdf 파일명 저장
        i=i+1
        wb.Close(False) #workbook 닫기, True일 경우 그 상태를 저장한다.
        excel.Quit()  # excel application 닫기


#실행부
filepath = "엑셀파일 경로"
pdfpath = "pdf파일을 저장할 경로"
excelinfo = excelInfo(filepath)
transPDF(excelinfo, pdfpath)


 

파이썬 .py 파일 코드는 아래 첨부파일을 다운받으면 된다.

pdf_transform.zip
0.00MB

 

 

 다음 포스팅에서는 각각 시트가 아닌 한개 엑셀파일의 모든 시트를 1개 pdf파일로 저장하는 방법에 대해 포스팅해보려고 한다.  2편을 참고!!

2편 : 2021.08.10 - [코딩/업무자동화] - [파이썬/업무자동화] 여러개 pdf 파일 1개로 합치기(+엑셀 응용)


참고링크 : 아무튼워라벨 - http://hleecaster.com/python-excel-to-pdf/

 

엑셀 pdf 변환/저장 (파이썬으로 자동화) - 아무튼 워라밸

파이썬으로 엑셀 파일의 특정 시트를 pdf로 변환(저장)하는 코드를 짜보았다. pywin32 패키지를 활용했다. 역시 업무 자동화에는 파이썬이 최고다.

hleecaster.com

 

 

728x90