107 lines
4.1 KiB
Python
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() |