본문 바로가기

코딩/업무자동화

[파이썬/업무자동화] 엑셀 시트별 분리 저장 - 2

반응형

※ 이 글을 쓰는 사람은 SW 비전공자입니다.

※ 개인 공부를 위해 정리하는 글이며, 작성한 코드들은 효율성, 깔끔함(?) 등과는 거리가 멀 수 있습니다.

 

1편: 2021.03.03 - [코딩/Python] - [Python/파이썬] 엑셀 시트별 분리 저장 - 1 (필요 사항 정리)

2편 : 2021.03.04 - [코딩/Python] - [Python/파이썬] 엑셀 시트별 분리 저장 - 2

3편 : 2021.03.05 - [코딩/Python] - [Python/파이썬] 엑셀 시트별 분리 저장 - 3

4편 : 2021.03.05 - [코딩/Python] - [Python/파이썬] 엑셀 시트별 분리 저장 - 코드 및 테스트 양식


  이전 1편에서 프로그램에 필요한 부분을 정리하였음.

일단 이 프로그램을 구현한 사람은 비전공자이며, 파이썬 공부를 위해 정리한 글이라는 것을 밝혀둠.

제가 할 수있는 선에서 기능 구현을 한 것이라 효율적인 코딩, 깔끔한 코드랑은 거리가 멀 수 있습니다...

 

1. 필요한 모듈 import

-. 1편에서 설명한대로 기본적인 기능은 os 모듈과 openpyxl 모듈을 사용하여 구현.

-. os는 파일 경로를 받아오는데 사용하기 위한 모듈이며, openpyxl은 엑셀을 읽고 제어할 수 있는 모듈이다.

-. os는 기본적으로 파이썬에 내장되어 있어 바로 import가 가능하지만, openpyxl은 설치가 필요하다.

-. shutil의 경우 폴더 파일 이동, 디렉토리 제어 등을 위한 내장 모듈이다.

import os
import openpyxl as op
import shutil

 

2. 함수 정의부

-. 함수는 2개로 정의하였음(ws_edit( ), PartNumberCode( ) )

  1) ws_deit ( )

   openpyxl 모듈의 worksheet 객체를 입력으로 받아 문자열(string)을 return값을 받는다.

  주석에서 설명한대로 엑셀 파일의 worksheet에서 'A1'셀에 있는 문자열을 입력받음. 단, 파일에 따라 'A1'이 아니라        'B1'에 문자열 데이터가 있는경우가 있어서 'A1'이 비어있는 경우 첫번째 열을 삭제하는 코드를 넣음.

  리턴 결과는 'A1'셀의 데이터를 문자열(str type) 이다.

 

# worksheet를 객체로 받아 처리하는 함수 , 'A1'의 값을 리턴값으로 받는다.
def ws_edit(ws):
    if ws.cell(row=1, column=1).value == None: . 
         ws.delete_cols(1)#'A1'셀이 비어있는경우 첫번째열을 삭제한다. 나중에 저장할 때양식 통일을 위해 작성한 부분
    ws_return = ws.cell(row=1, column=1).value # 'A1'셀의 값을 리턴값으로 받음
    return ws_return

 

< 'A1 셀의 문자열' >

 

위 함수의 결과  : ws_return = "Model name: 123, File version : 10, production code : 2134-1321-AA" 

 

  2) PartNumberCode ( ) 

  PartNumberCode는 ws_edit 함수에서 받아온 결과 문자열을 통해 상품코드를 추출한다.

#위 함수에서 'A1' 리턴값을 입력으로 받아 Production code 추출하는 함수
def PartNumberCode(text): 
    a = text.split(',') # 입력받은 문자열을 ,(콤마) 기준으로 분리하여 리스트화 한다.
    b = a[-1].find("2") # 리스트 인덱싱[-1] 을 하여 '2'로시작하는 위치를 찾음
    pn_return = a[-1][b:b+13] #인덱싱을 통해 '2'위치부터 12자리 문자열을 읽어온다 (문자열 인덱싱은 끝문자 포함X)
    return pn_return

-. 함수 첫줄의 split 함수는 문자열을 특정 문자 기준으로 분리하여 리스트로 변경할 수 있다. 위 엑셀파일 기준으로 a는 아래 3개 문자열 요소를 가진 리스트이다.

< a 변수 저장되는 리스트 요소>

 

-. 두번째 줄의 b는 위 a라는 리스트에서 인덱싱(-1)을 통해서 3번째 요소에 접근하여 코드 '2134-1321-AA'의 시작위치를 반환해주는 함수이다. 즉, 결과는 integer type이다. 

< 파이썬 문자열 인덱싱 참고 : 첫번째 요소의 index는 0이며, 첫번째 요소를 기준으로 -1로 마지막 요소에 접근 가능 >

 

-. b = a[-1].find('2') 라는 구문은 a라는 리스트의 마지막 요소에 접근하여 문자열 중 2라는 위치를 찾으라는 것이다.

b의 결과는 2의 위치인 19가 된다.(아래 이미지 참고)

< find 함수 값 > 

-. 마지막으로 pn_return = a[-1][b:b+13] 이라는 구문은 위 이미지로 설명할 수 있다. a라는 리스트의 마지막 요소에서 위치 19 부터 31까지 문자열을 읽어오는 것이다. b+13인 이유는 파이썬에서 문자열 인덱싱을 할 때 끝은 포함하지 않기 때문이다.

< return 결과 >

 

 

3. 실제 기능 구현부

-. openpyxl에서 직접적으로 시트를 분리하고 따로 저장하는 함수는 없는 것 같다.

-. 그래서 어떻게 할까 생각하다가 조금 다르게 생각하여 '상품' 시트수만큼 파일을 생성하고 원하는 시트만 남기는 방법으로 구현해보았다. 표현하기가 어려워서 아래와 같이 도식화해보았다.

< 엑셀 시트 분리 프로그램 도식화>

 

 

도식화에 대한 내용을 프로그래밍 한 것은 3편에서 정리예정

728x90