본문 바로가기

[교대근무 관리프로그램] 파이썬으로 교대근무 스케쥴표 엑셀로 저장하기

ironwhale 2022. 10. 3.

openpyxl로 스케쥴표를 엑셀로 저장하기 

 파이썬으로 엑셀을 사용하려면 openpyxl를 사용해야 합니다. openpyxl  기본 사용법, 딕셔너리의 키와 값을 바꾸는 방법 for문 안에 if없이 조건 사용하는 방법입니다. 

기본 사용법

1. 워크북은 생성한다.             wb = load_workboo(파일명)

2. 워크시트 객체를 생성한다. ws = wb["시트명"]

3. 셀에 값을 입력한다.           ws.cell(row=1, column=1,value="A1")

4. 엑셀파일로 저장한다.        wb.save(파일명)

물론 위에 방법 말고도 여러가지 방법이 있지만 제가 선택한 방법은 위에 방법입니다. 

 

일단 이것에 앞서 저는 fastapi와 mysql을 이용해서 날짜별로 근무조를 입력해놓았습니다. 9월 1일을 예로 들면 주간 근무는 4조, 야간근무는 2조, 1조와 3조는 휴무일입니다. 

위와 같은 되어 있는 표를 이제 아래와 같은 기존의 양식으로 바꿔줘야 합니다. 

기본적인 구현 방법 

#1. DB에 저장된 데이터를 저는 json형태로 받아 왔습니다. 

#2. json형태의 데이터를 Shift 오브젝트로 만들었고

#3. off, day, nigtht를 각각 기존의 양식과 같은 형태로 만들기 위한 딕셔너리를 만들었습니다. 

#4. 각 셀에 데이터를 입력하는 부분입니다.  

#1
{'mdate': '2022-10-01', 'day': 3, 'night': 1, 'off': 2, 'off2': 4, 'id': 31}

#2
class Shift:   

    def __init__(self, data):  
        
        self.id = data["id"]
        self.mdate = datetime.strptime(data["mdate"],"%Y-%m-%d") 
        self.day = data["day"]
        self.night = data["night"]
        self.off = data["off"]
        self.off2 = data["off2"]
        self.dic_data = data
#3
shift_name={
    "off":"♣",
    "off2":"♣",
    "day": "주간",
    "night":"야간"    
}

#4
for i,shift in enumerate(shifts):
    dic_data = {v:k for k,v in shift.dic_data.items()}
    ## 날짜 입력
    ws.cell(row=3,column=i+4, value=shift.mdate)
    ## 1조 입력
    ws.cell(row=5,column=i+4, value=shift_name[dic_data[1]])
        ## 2조 입력
    ws.cell(row=7,column=i+4, value=shift_name[dic_data[2]])
        ## 3조 입력
    ws.cell(row=9,column=i+4, value=shift_name[dic_data[3]])
        ## 4조 입력
    ws.cell(row=11,column=i+4, value=shift_name[dic_data[4]])

 

핵심부분!! 

day를 주간으로 바꾸기 

#3, #4가 제가 생각하는 핵심부분입니다. day를 "주간"으로 바꾸기 위해 for문 안에 if문을 사용할수 있지만 그렇게 되면 프로그램의 성능이 떨어진는 결과가 나옵니다. 따라서 딕셔너리를 활용하여 조건에 따라 실제 저장되는 값이 바뀌도록 하였습니다. 

또한 {day:1}을 {1:day}로 바꾸는 과정이 필요하기 때문에 < dic_data = {v:kfork,vinshift.dic_data.items()} > 이런 코드를 구현하여 키와 값을 바꿔주었습니다. 

댓글