import time import datetime from docx import Document from docx.shared import Inches import win32com from win32com.client import Dispatch, constants import os import sys import ruamel.yaml as yaml class WEEK_REPORT: file_name = "" pre_file_name = "" pre_str = "" str = "" user_name = "" __word = "" __doc = "" def __init__(self): with open("config.yaml", "r", encoding="UTF-8") as f1: data = yaml.safe_load(f1) print("config.yaml: {}".format(data)) self.user_name = data["user_name"] self.get_name() def get_name(self): self.file_name = "{}WW{}周工作报告_{}.doc".format(time.strftime('%Y'), time.strftime('%W'), self.user_name) self.pre_file_name = "{}WW{}周工作报告_{}.doc".format(time.strftime('%Y'), str(int(time.strftime('%W'))-1), self.user_name) print("pre file name: {}; \nnew file name: {};".format(self.pre_file_name, self.file_name)) if(os.path.isfile(self.file_name)==True): print("{} is already exist.".format(self.file_name)) self.open_file() sys.exit(1) def copy_file(self): os.system('copy {} {}'.format(self.pre_file_name, self.file_name)) def open_file(self): self.word = Dispatch('Word.Application') # 或者使用下面的方法,使用启动独立的进程: # word = DispatchEx('Word.Application') self.word.Visible = 1 # 0:后台运行 1:前台运行(可见) self.word.DisplayAlerts = 0 # 不显示,不警告 self.doc = self.word.Documents.Open(os.getcwd() + "\\{}".format(self.file_name)) def edit_file(self): s = self.word.Selection s.Find.Execute("{}WW{}".format(time.strftime('%Y'), str(int(time.strftime('%W'))-1)), False, False, False, False, False, True, 1, False, "{}WW{}".format(time.strftime('%Y'), time.strftime('%W')), 1) self.get_last_week() self.get_current_week() s.Find.Execute(self.pre_str, False, False, False, False, False, True, 1, False, self.str, 1) def update_file(self): self.open_file() self.edit_file() self.doc.Save() # doc.SaveAs(os.getcwd() + "\\funOpenExistFile.docx") # 另存为 def close_file(self): self.doc.Close() # 关闭 word 文档 self.word.Quit() # 关闭 office def get_last_week(self, date=None): if date: today = datetime.datetime.strptime(str(date), '%Y-%m-%d') else: today = datetime.datetime.today() end_time = today - datetime.timedelta(days=today.isoweekday()) -datetime.timedelta(days=2) start_time = end_time - datetime.timedelta(days=4) # return start_time.strftime("%Y-%m-%d"), end_time.strftime("%Y-%m-%d") self.pre_str = start_time.strftime("%#m.%#d") + "~" + end_time.strftime("%#m.%#d") print("pre_str: {}".format(self.pre_str)) def get_current_week(self,date=None): if date: duty_date = datetime.datetime.strptime(str(date), '%Y-%m-%d') monday, friday = duty_date, duty_date else: monday, friday = datetime.date.today(), datetime.date.today() one_day = datetime.timedelta(days=1) while monday.weekday() != 0: monday -= one_day while friday.weekday() != 4: friday += one_day # return datetime.datetime.strftime(monday, "%Y-%m-%d"), datetime.datetime.strftime(friday, "%Y-%m-%d") self.str = datetime.datetime.strftime(monday, "%#m.%#d") + "~" + datetime.datetime.strftime(friday, "%#m.%#d") print("str: {}".format(self.str)) if __name__ == "__main__": week_report = WEEK_REPORT() week_report.copy_file() week_report.update_file()