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 import logging.config 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) logger.debug("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) logger.info("pre file name: {}".format(self.pre_file_name)) logger.info("new file name: {};".format(self.file_name)) if(os.path.isfile(self.file_name)==True): logger.info("{} 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) # run 宏 # self.doc.run("update") 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") logger.debug("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") logger.debug("str: {}".format(self.str)) if __name__ == "__main__": with open("log_config.yaml", 'r') as f: config = yaml.safe_load(f.read()) logging.config.dictConfig(config) logger = logging.getLogger("file_logger") week_report = WEEK_REPORT() week_report.copy_file() week_report.update_file()