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)

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Django是一个用于快速开发Web应用程序的Python Web框架。而python-docx-template是一个Python库,它可以使用Word文档作为模板,然后根据传入的数据批量生成Word文档。在Django中,我们可以利用python-docx-template库来实现批量生成Word文档的功能。 首先,我们需要在Django项目中安装python-docx-template库。可以使用pip命令来安装该库: ```bash pip install python-docx-template ``` 接下来,我们可以在Django项目中创建一个视图函数,用于接收数据并根据模板生成Word文档。在视图函数中,我们可以使用python-docx-template库提供的方法将数据填充到Word模板中,生成最终的Word文档。 例如,假设我们有一个Word文档模板`template.docx`,里面包含了一些需要填充数据的位置,我们可以在Django中这样写视图函数: ```python from docxtpl import DocxTemplate from django.http import HttpResponse def generate_word_document(request): # 从请求中获取数据 data = request.GET.get('data', '') # 读取Word模板 doc = DocxTemplate("template.docx") # 根据数据填充模板 context = {'data': data} doc.render(context) # 写入生成的Word文档 doc.save("generated_document.docx") # 返回生成的Word文档给用户 with open("generated_document.docx", 'rb') as f: response = HttpResponse(f.read(), content_type='application/vnd.openxmlformats-officedocument.wordprocessingml.document') response['Content-Disposition'] = 'attachment; filename=generated_document.docx' return response ``` 通过上述视图函数,我们可以在Django项目中实现批量生成Word文档的功能,用户可以通过传入数据来生成他们所需的Word文档。这样我们就可以方便地利用Python和Django来批量生成Word文档,提高生产效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值