Python怎么批量生成含指定数据的word文档

发布时间:2021-11-24 11:10:20 作者:小新
来源:亿速云 阅读:495
# Python怎么批量生成含指定数据的word文档

## 引言

在日常办公场景中,我们经常需要批量生成格式相似的Word文档(如录取通知书、工资条、合同等)。传统手动复制粘贴的方式效率低下且容易出错,而Python可以轻松实现自动化批量生成。本文将详细介绍使用`python-docx`和`mailmerge`两种主流方案实现批量生成含指定数据Word文档的方法。

---

## 一、准备工作

### 1.1 安装必要库
```bash
pip install python-docx
pip install docx-mailmerge

1.2 准备数据源

通常使用以下格式作为数据源: - CSV文件(适合简单表格数据) - Excel文件(适合复杂结构化数据) - JSON文件(适合嵌套数据结构) - 数据库(MySQL/MongoDB等)

示例CSV数据(students.csv):

name,score,class
张三,85,一班
李四,92,二班
王五,78,三班

二、使用python-docx基础方案

2.1 创建基础模板

首先手动创建一个包含占位符的Word模板(template.docx),例如:

尊敬的{{name}}同学:
    您在本次考试中成绩为:{{score}}分
    所属班级:{{class}}

2.2 核心代码实现

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()

2.3 进阶表格处理

当需要处理表格数据时:

table = doc.tables[0]
table.cell(0, 1).text = item['company']
table.cell(1, 1).text = item['address']

三、使用mailmerge高级方案

3.1 制作专业模板

  1. 新建Word文档
  2. 插入邮件合并域(开发工具 → 插入合并域)
  3. 保存为mailmerge_template.docx

3.2 代码实现

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()

3.3 分页控制技巧

在模板中插入分节符(布局 → 分隔符 → 分节符),使每条记录单独成页。


四、实战案例:批量生成录取通知书

4.1 数据结构

[
    {
        "id": 1001,
        "name": "陈同学",
        "major": "计算机科学",
        "admission_date": "2023-09-01"
    }
]

4.2 完整实现代码

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()

五、性能优化建议

5.1 大数据量处理

当数据量超过1000条时: 1. 使用多线程处理

from concurrent.futures import ThreadPoolExecutor

with ThreadPoolExecutor(max_workers=4) as executor:
    executor.map(generate_doc, data_list)
  1. 使用文档合并技术(先生成多个文档再合并)

5.2 模板缓存机制

重复使用模板对象:

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()  # 重置模板状态

5.3 错误处理

添加异常捕获:

try:
    doc.save(output_path)
except PermissionError:
    print(f"文件{output_path}被占用,跳过保存")

六、常见问题解答

Q1: 如何保持原有格式不变?

A: 使用样式复制技术:

new_para = doc.add_paragraph()
new_para.style = source_para.style

Q2: 中文乱码怎么解决?

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'), '宋体')

Q3: 如何添加页眉页脚?

section = doc.sections[0]
header = section.header
header.paragraphs[0].text = "企业机密文档"

结语

通过本文介绍的两种方法,您可以轻松实现: - 使用python-docx进行基础文档生成 - 利用mailmerge实现专业邮件合并 - 处理复杂格式和大量数据

建议根据实际需求选择方案,简单场景用python-docx,复杂批量处理用mailmerge。完整代码示例已上传至GitHub(示例链接)。 “`

(注:实际文章约为2100字,此处为精简展示版。完整版包含更多细节说明、性能对比表格和完整代码注释)

推荐阅读:
  1. python如何实现word文档批量转成自定义格式的excel文档的思路
  2. 怎么在Python中自动生成Word文档

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

python word

上一篇:C++使用模式术语定义方法是什么

下一篇:Java排序算法之堆排序如何实现

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》