【Python】 한 달 분의 일보를 작성한다.

파이썬을 사용하여 Excel 파일 작업을 공부하고 있습니다.
파이썬에서 Excel을 조작하기 위해 openpyxl이라는 패키지를 사용하고 있습니다.

2020년의 1월 25일부터 Python을 공부하기 시작해 2주일 정도였기 때문에(적당)
일단 다시 복습도 하지 않고, 한 달분의 일보를 만들어 보고 싶습니다.


우선, 상기와 같은 「원지」시트를 가지는 북 「일보」를 작성합니다.
실현하고 싶은 내용은 다음과 같습니다.

1 한 달분의 일보를 만든다(2021년 2월도라면 2월 1일~2월 28일까지)
2 작성하는 시트는 영업일분만(토일축은 휴무.회사 휴일 지정일은 감안하지 않는다).
3 복사한 일보에는 D1셀에 일자와 요일을 입력해 둔다.
4 복사한 일보의 시트명은 「△일」이라고 하는 표기로 한다.
5 책의 이름은 「일보_0월도」라고 하는 표기로 한다.

지정한 월의 일수를 취득



input 함수를 사용하여 연도와 월을 지정합니다.
일수를 얻으려면 calendar.monthrange() 함수를 사용하는 것이 좋습니다.

calendar.monthrange() 함수



월의 첫날 요일(월요일은 0, 일요일은 6)과 월의 일수의 튜플을 얻을 수 있습니다.
첫 번째 인수에 연도, 두 번째 인수에 월을 지정합니다.
이번에는 일수를 얻고 싶기 때문에 [1]을 뒤에 붙입니다.
import calendar

print(calendar.monthrange(2021, 2))
--> (0, 28)

print(calendar.monthrange(2021, 2)[1])
# 28

이쪽을 근거로, 기술합니다.

지정한 월의 일수를 취득
year = input('年を半角数字で入力してください。 例「2020」: ')
month = input('月を半角数字で入力して下さい。 例「1」: ')
count = calendar.monthrange(int(year), int(month))[1]

영업일만 시트를 만듭니다.



일수를 얻을 수 있었으므로, for분을 사용해 시트를 카피해 가고 싶습니다만
휴일분도 만들고 있어는 낭비이므로, 사전에 판정합니다.
datetime 객체의 weekday() 메서드를 시도하면
월요일은 0, 일요일은 6의 정수 값을 얻습니다.
import datetime

dt = datetime.datetime(2021, 2, 1)
print(dt)
# 2021-02-01 00:00:00

print(dt.weekday())
# 0

공휴일 판정은 JPHoliday 패키지를 사용합니다.
자세한 내용은 여기를 확인하십시오. 멋진 패키지! 감사합니다!
# 指定日が祝日か判定
import jpholiday
import datetime
jpholiday.is_holiday(datetime.date(2017, 1, 1))
> True

여기를 사용하여 if 문을 만듭니다.

토, 일, 공휴일 이외에는 시트를 복사
# 日本語文字列の曜日リストを定義
wb = load_workbook('日報.xlsx')

# 「原紙」のシートを取得
ws_template = wb['原紙']

for i in range(1, int(count) +1):
    # 曜日を取得
    dt = datetime.datetime(int(year), int(month), i)
    holiday = jpholiday.is_holiday(datetime.date(int(year), int(month), i))
    week = dt.weekday()
    # 土日祝を判定
    if week != 5 and week != 6 and holiday == False:
        # シートをコピーする
        ws_copy = wb.copy_worksheet(ws_template)

이번은 토·일·축의 3일분의 판정이었으므로 이런 기술이 되었습니다.
토, 일, 공휴 관계 없는 3연근 1일 휴가라면 어떻게 하면 좋을까・・・.
생각해 보는 것도 어려울 것 같지만, 즐거워 보이는군요!

지정된 셀에 날짜와 요일을 입력합니다.



이곳은 요전날 공부한 곳이므로 바삭바삭 진행합니다.
날짜의 기재가 있던 셀은 D1~G1까지가 셀이 결합되고 있습니다만
대표(라고 해도 말할까요)의 D1셀에 설정해 줍니다.

지정된 셀에 날짜와 요일 설정
        # コピーしたシートのセルD1に日付と曜日を設定
        ws_copy['D1'] = f'{month}{i}{w_list[week]}'

이번은 일자와 요일 뿐이었습니다만 사원명이라도 똑같이 조금 기술을 괴롭히면 할 수 버립니다.

일보의 시트명은 「△일」이라고 하는 표기로 한다.



이쪽도 이전 공부한 곳이군요. 바삭바삭 진행합니다♪

시트명을 「△일」이라고 하는 표기로 한다.
        # シート名を日付にする
        ws_copy.title = f'{i}日'

시트명을 「0월△일」이라고 하는 표기로 한다.
        # シート名を日付にする
        ws_copy.title = f'{month}{i}日'

개인적인 취향입니다만 시트명이 긴 것은 싫기 때문에, 이번은 일자만의 표기로 했습니다.

북의 이름은 「일보_0월도」라고 하는 표기로 한다.



마지막으로 책 이름을 변경하고 저장합니다.

북명을 「일보_0월도」라고 하는 표기로 해 보존한다
# ブック名を変更して保存
wb.save(f'日報_{month}月度.xlsx')

완성된 코드



라고 하는 번역으로 완성된 코드가 이쪽입니다.

create_report.py
from datetime import date
from openpyxl import load_workbook
import calendar
import datetime
import jpholiday

# 年と月を入力し日数を取得
year = input('年を半角数字で入力してください。 例2020: ')
month = input('月を半角数字で入力して下さい。 例1: ')
count = calendar.monthrange(int(year), int(month))[1]

# 日本語文字列の曜日リストを定義
w_list = ['月曜日', '火曜日', '水曜日', '木曜日', '金曜日', '土曜日', '日曜日']

wb = load_workbook('日報.xlsx')

# 「原紙」のシートを取得
ws_template = wb['原紙']

for i in range(1, int(count) +1):
    # 曜日を取得
    dt = datetime.datetime(int(year), int(month), i)
    holiday = jpholiday.is_holiday(datetime.date(int(year), int(month), i))
    week = dt.weekday()
    # 土・日・祝を判定
    if week != 5 and week != 6 and holiday == False:
        # シートをコピーする
        ws_copy = wb.copy_worksheet(ws_template)
        # コピーしたシートのセルD1に日付と曜日を設定
        ws_copy['D1'] = f'{month}{i}{w_list[week]}'
        # シート名を日付にする
        ws_copy.title = f'{i}日'

# ブック名を変更して保存
wb.save(f'日報_{month}月度.xlsx')

수고하셨습니다. 여기까지 읽어 주셔서 감사합니다.
Python의 공부를 처음으로 아직 2주일 정도입니다만 어떻게든 만들 수 있었습니다.

아직도, 하고 싶은 일도 많기 때문에 조금씩 공부를 진행해 가
실현할 수 있게 되고 싶네요!

좋은 웹페이지 즐겨찾기