week_report/gen_word.py
2023-10-30 13:53:47 +08:00

107 lines
4.1 KiB
Python

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