wordの表の中のテキストを書き換えるコードを書いた
そのあとPysimpleGUIの使い方を勉強のためGUIで入力ボックスを作成
word書き換えプログラム全体を関数化
GUIで入力された値を自作関数に渡し実際にファイルを書き換えることができた。
初心者ながら形になってきたのでアウトプットします
↓docxファイルを書き換えるプログラム
import docx
import datetime
import os
import PySimpleGUI as sg
t_delta = datetime.timedelta(hours=9)
JST = datetime.timezone(t_delta, 'JST')
now = datetime.datetime.now(JST)
d_week = {'Sun': '日', 'Mon': '月', 'Tue': '火', 'Wed': '水',
'Thu': '木', 'Fri': '金', 'Sat': '土'}
key = now.strftime('%a')
w = d_week[key]
d = now.strftime('%Y年%m月%d日') + f'({w})' #f'{now:%Y年%m月%d日}({w})'
def Report(event,values):#Report.exeで入力した値を読み取ってdocxに書き込む関数
doc1 = docx.Document("訓練日誌(before).docx")
tbl = doc1.tables[0]
section = 0
teacher = 0
late = 0
remakes = 0
cel0 = tbl.cell(0,6)
para = cel0.paragraphs[0]
t = para.text
t = t.replace("Writer",values["writer"])
para.text = t
for cel1 in range(7):
section = cel1
cel1 = tbl.cell(cel1+2,2)
para = cel1.paragraphs[0]
t = para.text
t = t.replace("Section",values["section" + str(section+1)])
para.text = t
for cel2 in range(7):
teacher = cel2
cel2 = tbl.cell(cel2+2,3)
para = cel2.paragraphs[0]
t = para.text
t = t.replace("Teacher",values["teacher" + str(teacher+1)])
para.text = t
for cel3 in range(7):
late = cel3
cel3 = tbl.cell(cel3+2,5)
para = cel3.paragraphs[0]
t = para.text
t = t.replace("Late",values["late" + str(late+1)])
para.text = t
for cel4 in range(7):
remakes = cel4
cel4 = tbl.cell(cel4+2,6)
para = cel4.paragraphs[0]
t = para.text
t = t.replace("Remakes",values["remakes" + str(remakes+1)])
para.text = t
cel5 = tbl.cell(2,4)
para = cel5.paragraphs[0]
t = para.text
t = t.replace("Absence",values["absence"])
para.text = t
cel6 = tbl.cell(9,2)
para = cel6.paragraphs[0]
t = para.text
t = t.replace("Report",values["report"])
para.text = t
cel7 = tbl.cell(0,0)
para = cel7.paragraphs[0]
t = para.text
t = t.replace("M",now.strftime("%m")).replace("D",now.strftime("%d")).replace("W",w)
para.text = t
if event == "OK":
doc1.save("訓練日誌(完了).docx")
doc2 = docx.Document("訓練日誌(空白).docx")
doc2.save("訓練日誌(途中).docx")#"OK"で終わると値が空白のファイルを作る
if event == "OFF"
doc1.save("訓練日誌(途中).docx")
def Printout():#印刷する関数
os.startfile("訓練日誌(完了).docx","print")
↓GUIウィンドウを表示し入力させるプログラム
from email.policy import default
import PySimpleGUI as sg
import datetime
import docx
from Word import Report
from Word import Printout
t_delta = datetime.timedelta(hours=9)
JST = datetime.timezone(t_delta, 'JST')
now = datetime.datetime.now(JST)
d_week = {'Sun': '日', 'Mon': '月', 'Tue': '火', 'Wed': '水',
'Thu': '木', 'Fri': '金', 'Sat': '土'}
key = now.strftime('%a')
w = d_week[key]
d = now.strftime('%Y年%m月%d日') + f'({w})' #f'{now:%Y年%m月%d日}({w})'
doc = docx.Document("訓練日誌(途中).docx")#このファイルの値を入力ボックスのデフォルト値にする
tbl = doc.tables[0]
cel_writer = tbl.cell(0,6)
para_writer = cel_writer.paragraphs[0]
t_writer = para_writer.text
layout = [
[sg.Text("訓練日誌",font=("MS ゴシックUB",30))],[sg.Text(d)],[sg.Text(" 記入者"),sg.Input(default_text=t_writer,key="writer",size=(20,5)),sg.Text(" 先生"),sg.Text(" 欠席、早退\n (その時間休んだ人)"),sg.Text(" 備考")]
]
for i in range(7):#1~7限目の入力ボックスを配置
cel_section = tbl.cell(i+2,2)
para_section = cel_section.paragraphs[0]
t_section = para_section.text#訓練日誌(途中).docxの各セルから値を取得
cel_teacher = tbl.cell(i+2,3)
para_teacher = cel_teacher.paragraphs[0]
t_teacher = para_teacher.text
cel_late = tbl.cell(i+2,5)
para_late = cel_late.paragraphs[0]
t_late = para_late.text
cel_remakes = tbl.cell(i+2,6)
para_remakes = cel_remakes.paragraphs[0]
t_remakes = para_remakes.text
layout.append([sg.Text(str(i+1) + "限目",font=("MS ゴシックUB",20)),sg.Multiline(default_text=t_section,size=(20,3),key="section" + str(i+1)),sg.Input(default_text=t_teacher,size=(10,10),key="teacher" + str(i+1)),sg.Multiline(default_text=t_late,size=(20,3),key="late" + str(i+1)),sg.Multiline(default_text=t_remakes,size=(30,3),key="remakes" + str(i+1))])#入力のデフォルト値を取得した値に設定
cel_absence = tbl.cell(2,4)
para_absence = cel_absence.paragraphs[0]
t_absence = para_absence.text
cel_report = tbl.cell(9,2)
para_report = cel_report.paragraphs[0]
t_report = para_report.text
layout.append([sg.Text(" 一日欠席 "),sg.Multiline(default_text=t_absence,size=(20,3),key="absence")])
layout.append([sg.Text("感想",font=("MS ゴシックUB",25)),sg.Multiline(default_text=t_report,font=(20),size=(70,5),key="report")])
layout.append([sg.Checkbox("黒板は消しましたか?",default=False,key="erace")])
layout.append([sg.Checkbox("戸締りはしましたか?",default=False,key="shut")])
layout.append([sg.Button("確認したらクリック",key="check")])
layout.append([sg.Button("印刷",key="OK",size=(20,3),font=("MS ゴシックUB",10),button_color=("yellow","black"),disabled=True),sg.Button("保存して閉じる",key="OFF")])
window = sg.Window(d,layout)
while True:
event,values = window.read()
if event == "check" and values["erace"] == True and values["shut"] == True:
window["OK"].update(disabled=False)
if event == "check" and values["erace"] == False:
window["OK"].update(disabled=True)
if event == "check" and values["shut"] == False:
window["OK"].update(disabled=True)
if event == "OK" :#訓練日誌(完了).docxを保存して印刷する
Report(event,values)
Printout()
break
if event == "OFF":#訓練日誌(途中).docxを保存して閉じる
Report(event,values)
break
if event == sg.WIN_CLOSED:
break
window.close()