# PythonによるWordファイルの自動作成とWordファイルの自動書式設定
# 「日報」用の文書ファイルをまとめて作成
# 必要なモジュールを呼び出す
import docx
from datetime import datetime, date, timedelta
import mojimoji
import PySimpleGUI as sg # ★
# 曜日の日本語変換辞書を設定する
youdic = {'Mon':'月', 'Tue':'火','Wed':'水','Thu':'木','Fri':'金','Sat':'土','Sun':'日'}
# 入出力画面のレイアウトを定義する(入力欄にはデフォルトで値を表示しておく) # ★
hiduke = '0'
layout = [[sg.Text('「日報」を作る最初の年月日を数字8桁で入力してください'), sg.Input(default_text='20230206',key='input1')], # ★
[sg.Text('「日報」を作る日数を数字1~31で入力してください'), sg.Input(default_text='5',key='input2')], # ★
[sg.Text('土日の「日報」を作りますか? 土日とも作らない=1、土曜のみ作る=2、日曜のみ作る=3、土日とも作る=4'),
sg.Input(default_text='1',key='input3')], # ★
[sg.Button('OK')], # ★
[sg.Output(size=(100,10))]] # ★
# 定義したレイアウトで入出力画面を生成する # ★
window = sg.Window('「日報」用の文書ファイルをまとめて作成', layout) # ★
# 入出力画面を表示し、 「日報」を作る最初の日などを入力すると、入力情報に基づき日報ファイルを生成する # ★
while True: # < 以下、画面表示ループ > ★
event, values = window.read() # ★
if event == None: # 入出力画面右上の「×」(閉じる)ボタンが押されると… ★
break # 画面表示ループを抜けて終了する ★
elif event == 'OK': # 「OK」ボタンが押されると… ★
hiduke = values['input1'] # 「日報」を作る最初の日を「hiduke」とする # ★
n = int(values['input2']) # 「日報」を作る日数を「n」とする # ★
d = int(values['input3']) # 土日の「日報」を作るかの選択肢を「d」とする # ★
# 入力されたデータが指定の範囲に収まっている場合だけ次の処理に移る # ★
if len(hiduke) == 8 and (n >= 1 and n <= 31) and (d >= 1 and d <= 4): # ★
# 「日報」を作る最初の日付を「date0」とする
nen = int(hiduke[0:4])
tuki = int(hiduke[4:6])
hi = int(hiduke[6:])
date0 = date(nen,tuki,hi)
# 以下の作業をn回繰り返す
for i in range(n):
# 最初の日「date0」に i 日( 0 ~ n-1 日)加算した日を「date1」とする
date1 = date0 + timedelta(days=i)
# 「date1」について「日報」に利用する様々な日付を作成する
nen = date1.year # 年(半角数値)
nenstr = str(nen) # 年(半角文字)
nenzen = mojimoji.han_to_zen(nenstr) # 年(全角文字)
tuki = date1.month # 月(半角数値)
tukistr = str(tuki) # 月(半角文字)
tukizen = mojimoji.han_to_zen(tukistr) # 月(全角文字)
hi = date1.day # 日(半角数値)
histr = str(hi) # 日(半角文字)
hizen = mojimoji.han_to_zen(histr) # 日(全角文字)
you = date1.strftime('%a') # 曜日(英語略表記)
date2 = str(date1.strftime('%Y%m%d')) # 日付(yyyymmdd形式 半角文字)
date3 = nenstr+'/'+tukistr+'/'+histr # 日付(yyyy/m/d形式 半角文字)
date4 = nenzen+'年'+tukizen+'月'+hizen+'日' # 日付(yyyy年m月d日形式 全角文字)
date5 = '('+youdic[you]+')' # 曜日(日本語表記カッコ付)
# 元になる文書ファイル(ひな形)を読み込み、「doc」に格納する
path = r'C:\Users\......\......\......\......\......\日報yyyymmdd.docx'
doc = docx.Document(path)
# 日報を作る曜日の分岐処理を行う
if (you == 'Mon' or you == 'Tue' or you == 'Wed' or you == 'Thu' or you == 'Fri')\
or (you == 'Sat' and (d == 2 or d == 4))\
or (you == 'Sun' and (d == 3 or d == 4)):
# 1つ目の表の2行目の1列目の1段落目のテキストを「par1」に格納する
par1 = doc.tables[0].rows[1].cells[0].paragraphs[0]
# 「par1」にある'Y年M月D日()'というテキストを実際に使用する日付・曜日に書き換える
par1.text = par1.text.replace('Y年M月D日()',date4+date5)
# 文書ファイルの新規作成
path = path.replace('yyyymmdd',date2)
doc.save(path)
print('パス '+path+' で新規にファイルを保存しました')
# ウィンドウを閉じる # ★
window.close() # ★