您好,登录后才能下订单哦!
# Python怎么批量生成含指定数据的word文档
## 引言
在日常办公场景中,我们经常需要批量生成格式相似的Word文档(如录取通知书、工资条、合同等)。传统手动复制粘贴的方式效率低下且容易出错,而Python可以轻松实现自动化批量生成。本文将详细介绍使用`python-docx`和`mailmerge`两种主流方案实现批量生成含指定数据Word文档的方法。
---
## 一、准备工作
### 1.1 安装必要库
```bash
pip install python-docx
pip install docx-mailmerge
通常使用以下格式作为数据源: - CSV文件(适合简单表格数据) - Excel文件(适合复杂结构化数据) - JSON文件(适合嵌套数据结构) - 数据库(MySQL/MongoDB等)
示例CSV数据(students.csv):
name,score,class
张三,85,一班
李四,92,二班
王五,78,三班
首先手动创建一个包含占位符的Word模板(template.docx),例如:
尊敬的{{name}}同学:
您在本次考试中成绩为:{{score}}分
所属班级:{{class}}
from docx import Document
import csv
def generate_docs():
# 读取CSV数据
with open('students.csv', encoding='utf-8') as f:
reader = csv.DictReader(f)
data = [row for row in reader]
# 遍历每条数据
for item in data:
doc = Document('template.docx')
# 替换段落中的占位符
for para in doc.paragraphs:
para.text = para.text.replace('{{name}}', item['name'])
.replace('{{score}}', item['score'])
.replace('{{class}}', item['class'])
# 保存新文档
doc.save(f'output_{item["name"]}.docx')
generate_docs()
当需要处理表格数据时:
table = doc.tables[0]
table.cell(0, 1).text = item['company']
table.cell(1, 1).text = item['address']
from mailmerge import MailMerge
import pandas as pd
def mailmerge_generate():
# 读取Excel数据
df = pd.read_excel('data.xlsx')
# 加载模板
template = "mailmerge_template.docx"
# 初始化邮件合并
document = MailMerge(template)
# 查看所有合并域
print(document.get_merge_fields())
# 执行合并
document.merge_rows('name', df.to_dict('records'))
# 输出结果
document.write('merged_output.docx')
mailmerge_generate()
在模板中插入分节符(布局 → 分隔符 → 分节符),使每条记录单独成页。
[
{
"id": 1001,
"name": "陈同学",
"major": "计算机科学",
"admission_date": "2023-09-01"
}
]
import json
from docx.shared import Pt, RGBColor
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
def generate_admission():
# 加载数据
with open('admission.json') as f:
students = json.load(f)
# 遍历生成
for stu in students:
doc = Document()
# 添加标题
title = doc.add_heading('录取通知书', level=0)
title.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
# 添加正文
content = [
f"编号:{stu['id']}",
f"{stu['name']}同学:",
"经审核,您已被我校{stu['major']}专业录取。",
"请于{stu['admission_date']}携带本通知书到校报到。"
]
for text in content:
p = doc.add_paragraph(text)
p.paragraph_format.line_spacing = 1.5
# 设置样式
font = doc.styles['Normal'].font
font.name = '微软雅黑'
font.size = Pt(12)
# 保存
doc.save(f'admission_{stu["id"]}.docx')
generate_admission()
当数据量超过1000条时: 1. 使用多线程处理
from concurrent.futures import ThreadPoolExecutor
with ThreadPoolExecutor(max_workers=4) as executor:
executor.map(generate_doc, data_list)
重复使用模板对象:
from docxtpl import DocxTemplate
tpl = DocxTemplate("template.docx")
for data in big_data:
tpl.render(data)
tpl.save(f"output_{data['id']}.docx")
tpl.new_subdoc() # 重置模板状态
添加异常捕获:
try:
doc.save(output_path)
except PermissionError:
print(f"文件{output_path}被占用,跳过保存")
A: 使用样式复制技术:
new_para = doc.add_paragraph()
new_para.style = source_para.style
A: 确保文件编码为UTF-8,字体设置为中文字体:
from docx.shared import Pt
from docx.oxml.ns import qn
run = para.add_run("中文内容")
run.font.name = '宋体'
r = run._element
r.rPr.rFonts.set(qn('w:eastAsia'), '宋体')
section = doc.sections[0]
header = section.header
header.paragraphs[0].text = "企业机密文档"
通过本文介绍的两种方法,您可以轻松实现: - 使用python-docx进行基础文档生成 - 利用mailmerge实现专业邮件合并 - 处理复杂格式和大量数据
建议根据实际需求选择方案,简单场景用python-docx,复杂批量处理用mailmerge。完整代码示例已上传至GitHub(示例链接)。 “`
(注:实际文章约为2100字,此处为精简展示版。完整版包含更多细节说明、性能对比表格和完整代码注释)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。