使用python根据模板批量生成docx文档

一、需求说明

能够根据模板批量生成docx文档。具体而言,读取excel中的数据,然后使用python批量生成docx文档。

二、实验准备

准备excel数据:

这里是关于学生语数英成绩的统计表,文件名为score.xls

准备模板:

这是给学生家长的成绩通知书,文件名为template.doc

另外,在使用python进行实验之前,需要先安装第三方库docxtpl和xlrd,直接pip install就行:

pip install docxtpl
pip install xlrd

然后将xls和doc和python文件放在同一个目录下

三、代码实现

首先打开xls,读取数据:

workbook = xlrd.open_workbook(sheet_path)

然后从文件中获取第一个表格:

sheet = workbook.sheet_by_index(0)

然后遍历表格的每一行,将数据存入字典列表:

tables = []
for num in range(1, sheet.nrows):
    stu = {}
    stu['name'] = sheet.cell_value(num, 0)
    stu['class'] = sheet.cell_value(num, 1)
    stu['language'] = sheet.cell_value(num, 2)
    stu['math'] = sheet.cell_value(num, 3)
    stu['English'] = sheet.cell_value(num, 4)
    tables.append(stu)

接下来将列表中的数据写入docx文档,其实这个过程可以在读数据时同时进行,即读完一行数据,然后生成一个文档。

首先在指定路径生成一个docx文档:

document = Document(word_path)

然后逐行进行正则表达式的替换:

paragraphs = document.paragraphs
    text = re.sub('name', stu['name'], paragraphs[1].text)
    paragraphs[1].text = text
    text = re.sub('name', stu['name'], paragraphs[2].text)
    text = re.sub('class', stu['class'], text)
    text = re.sub('language', str(stu['language']), text)
    text = re.sub('math', str(stu['math']), text)
    text = re.sub('English', str(stu['English']), text)
    paragraphs[2].text = text

其实不关心格式问题的,到现在为止就已经结束了。但是这样替换后docx中被替换的文字格式也被更改为系统默认的正文格式,所以接下来是将这些改成自己想要的格式:

遍历需要更改格式的段落,然后更改字体大小和字体格式:

for run in paragraph.runs:
            run.font.size = Pt(16)
            run.font.name = "宋体"
            r = run._element.rPr.rFonts
            r.set(qn("w:eastAsia"), "宋体")

最后保存文件:

document.save(path + "\\" + r"{}的成绩通知单.docx".format(stu['name']))

完整代码:

from docxtpl import DocxTemplate
import pandas as pd
import os
import xlrd
path = os.getcwd()
# 读表格
sheet_path = path + "\score.xls"
workbook = xlrd.open_workbook(sheet_path)
sheet = workbook.sheet_by_index(0)
tables = []
for num in range(1, sheet.nrows):
    stu = {}
    stu['name'] = sheet.cell_value(num, 0)
    stu['class'] = sheet.cell_value(num, 1)
    stu['language'] = sheet.cell_value(num, 2)
    stu['math'] = sheet.cell_value(num, 3)
    stu['English'] = sheet.cell_value(num, 4)
    tables.append(stu)
print(tables)

# 写文档
from docx import Document
import re
from docx.oxml.ns import qn
from docx.shared import Cm,Pt
for stu in tables:
    word_path = path + "\\template.doc"
    document = Document(word_path)
    paragraphs = document.paragraphs
    text = re.sub('name', stu['name'], paragraphs[1].text)
    paragraphs[1].text = text
    text = re.sub('name', stu['name'], paragraphs[2].text)
    text = re.sub('class', stu['class'], text)
    text = re.sub('language', str(stu['language']), text)
    text = re.sub('math', str(stu['math']), text)
    text = re.sub('English', str(stu['English']), text)
    paragraphs[2].text = text
    for paragraph in paragraphs[1:]:
        for run in paragraph.runs:
            run.font.size = Pt(16)
            run.font.name = "宋体"
            r = run._element.rPr.rFonts
            r.set(qn("w:eastAsia"), "宋体")
    document.save(path + "\\" + r"{}的成绩通知单.docx".format(stu['name']))

四、实验结果

文件中的文件:

生成的文件样例:

### 使用 Python-docx 批量创建 Word 文档 为了实现批量生成 `.docx` 文件的需求,可以通过 `python-docx` 库来完成这一任务。此库允许程序化地创建和修改基于 Office Open XML 标准的文档文件。 #### 创建单个文档的基础方法 在深入探讨批量生成之前,先了解如何利用 `python-docx` 来构建单一文档: ```python from docx import Document document = Document() # 添加标题 document.add_heading('Document Title', level=1) # 添加段落 p = document.add_paragraph('A plain paragraph having some ') p.add_run('bold').bold = True p.add_run(' and some ') p.add_run('italic.').italic = True # 保存文档 document.save('example.docx') ``` 上述代码展示了基本的操作流程,包括初始化一个新的 `Document` 对象、向其中添加不同样式的文本以及最终将更改写入磁盘[^1]。 #### 实现批量生成逻辑 当面对多个相似结构但内容有所差异的文档需求时,可以设计循环机制配合模板数据源来进行高效生产。下面给出一段示范性的批处理脚本: ```python import pandas as pd from docx import Document def create_document(data_row, template_path='template.docx'): """根据给定的数据行和个人简历模板路径创建个人简历""" # 加载模板文档 doc = Document(template_path) # 替换占位符为实际值 (假设模板中有名为 {name}, {position} 的占位符) for para in doc.paragraphs: for key, value in data_row.items(): placeholder = f'{{{key}}}' if placeholder in para.text: inline = para.runs for i in range(len(inline)): if placeholder in inline[i].text: text = inline[i].text.replace(placeholder, str(value)) inline[i].text = text output_filename = f"{data_row['name']}_resume.docx" doc.save(output_filename) return output_filename if __name__ == '__main__': df = pd.read_excel('candidates.xlsx') # 假设有一个 Excel 表格作为输入数据源 for index, row in df.iterrows(): created_file = create_document(row.to_dict()) print(f"Created file: {created_file}") ``` 这段代码实现了从电子表格读取候选人信息并据此自动生成一系列个性化求职信的功能。这里的关键在于定义好合适的模板,并确保能够正确映射到所需填充的具体字段上[^3]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值