Python笔记 (七)--根据模板文档批量修改生成docx文件(全年工作日)

需求

2019年,每日一份调研调研报告(工作日)。
文件名需要包含对应日期,例如:调研报告2019-XX-XX.docx。
文档内需要修改成对应日期,修改替换指定内容

运行环境

需要先安装requests、docx库

源代码

# -*- coding: utf-8 -*-

import os
import json
import time
import requests
from docx import Document

def Data_Loading():
    #遍历当前目录下,以docx为后缀的文件
    for parent, dirnames, filenames in os.walk('.', topdown=False):
        for filename in filenames:
            if filename[-5:] == '.docx':
                return filename

def Is_Exists(dirname):
    #判断目录是否存在
    if not os.path.exists(dirname):
        os.makedirs(dirname)

def Is_Weekday(M,D,dirname,filename):
    #提交参数给服务器,返回json格式的参数,0为工作日,1为休息日,2为节假日。每次GET请求后,设置睡眠时间,避免短时间请求并发数过多,导致服务器判别为流量型攻击主动断开连接,或者服务器崩溃
    req = requests.get('http://www.easybots.cn/api/holiday.php?d=2019' + M + D)
    vop_data = json.loads(req.text)
    time.sleep(10)
    if int(vop_data['2019' + M + D]) == 0:
        Update_Data(M,D,dirname,filename)

def Update_Data(M,D,dirname,filename):
    #Docx读写,定位需修改的元素,并进行替换,最后保存
    doc = Document(filename)
    tables = doc.tables
    table = tables[0]
    # 修改日期
    data = str(M + '-' + D)
    old_data = table.cell(3, 2).text[-5:]
    new_data = table.cell(3, 2).text[-5:].replace(old_data, data)
    old_text = table.cell(3, 2).text
    text = table.cell(3, 2).text[0:-5]
    table.cell(3, 2).text = table.cell(3, 2).text.replace(old_text, text + new_data)
    # 修改内容为“/”
    old_state = table.cell(9, 6).text
    table.cell(9, 6).text = old_state.replace(old_state, '/')
    #在指定的位置填入参数  “无”
    old_thing = table.cell(-1,0).text
    table.cell(-1, 0).text = old_thing.replace(old_thing, '无')
    doc.save(dirname+'/'+M+'月/'+filename[0:-10]+M+'-'+D+'.docx')

def Resolution_Date(dirname,filename):
    #辨别大小月
    for M in range(1, 13):
        M = str(M).zfill(2)  # 指定字符串的长度为2,长度不够就在前面填充0
        Is_Exists(dirname + '/' + M + '月')
        if M in ('01', '03', '05', '07', '08', '10', '12'):
            for D in range(1, 32):
                D = str(D).zfill(2)  # 指定字符串的长度为2,长度不够就在前面填充0
                Is_Weekday(M,D,dirname,filename)
        elif M in ('04', '06', '09', '11'):
            for D in range(1, 31):
                D = str(D).zfill(2)  # 指定字符串的长度为2,长度不够就在前面填充0
                Is_Weekday(M,D,dirname,filename)
        elif M == '02':
            for D in range(1, 29):
                D = str(D).zfill(2)  # 指定字符串的长度为2,长度不够就在前面填充0
                Is_Weekday(M,D,dirname,filename)
        else:
            print('脚本运行异常!')

def Main():
    filename1 = Data_Loading()
    dirname1 = input('请输入输出根目录的名称:')
    Is_Exists(dirname1)
    Resolution_Date(dirname1,filename1)

if __name__ == '__main__':
    Main()

附件

一开始因为疏忽,word文档内容只修改日期,没有替换修改其他内容。完善代码后,懒得在等待所有文档重新生成,所以,再写了以下脚本。

# -*- coding: utf-8 -*-
from docx import Document
import os

for parent, dirnames, filenames in os.walk('.'):
    for filename in filenames:
        if filename[-5:] == '.docx':
            path = os.path.join(parent, filename)#获取所有docx文件的路径
            doc = Document(path)#打开docx文档
            tables = doc.tables#获取文档内所有表格,形成表格集
            table = tables[0]
            old_thing = table.cell(-1, 0).text
            table.cell(-1, 0).text = old_thing.replace(old_thing, '无')
            doc.save(path)

你可能感兴趣的:(Python3)