LoginSignup
1
0

More than 1 year has passed since last update.

pythonでdocxファイルを操作するプログラム作成

Last updated at Posted at 2022-12-15

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()

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0