为什么用Python生成Word报告
典型场景:HR需要为200名员工生成年度评价报告,每份报告包含员工信息、绩效数据、发展建议。手动操作:打开模板 → 替换姓名 → 粘贴数据 → 调整格式 → 保存,每份约5分钟,200份需要16.7小时。用Python:写好脚本后,200份报告30秒生成,格式100%统一。
第一步:安装依赖库
- 安装核心库:
pip install python-docx - 安装Excel读取:
pip install openpyxl pandas - 安装PDF转换:
pip install docx2pdf(Windows)或pip install libreoffice(跨平台) - 安装邮件发送:
pip install secure-smtplib(如需自动发邮件) - 验证安装:在Python中执行
from docx import Document无报错即可
第二步:设计Word模板
模板是批量生成的基础,设计好模板后续只需填充数据:
- 在Word中创建报告模板,排版设定好字体、间距、页眉页脚
- 在需要替换的位置插入占位符标记:用双大括号包裹,如
{{name}}、{{department}} - 表格位置用特殊标记:
{{table_data}} - 图片位置用标记:
{{chart_image}} - 保存为 template.docx
模板结构示例:
- 标题:{{employee_name}} 年度评价报告
- 基本信息表格:姓名、部门、岗位、入职日期
- 绩效数据段落:{{performance_summary}}
- 评价详情表格:{{evaluation_table}}
- 发展建议:{{development_plan}}
- 签名页:{{reviewer_name}} {{review_date}}
第三步:编写批量生成脚本
核心代码逻辑:
- 读取Excel数据源:员工信息表
- 遍历每行数据
- 复制模板,替换占位符
- 生成表格数据
- 插入图片(如有)
- 保存为单独的Word文件
关键代码片段(简化版):
from docx import Documentimport pandas as pd
读取数据:df = pd.read_excel('employees.xlsx')
遍历生成:对每一行数据,打开模板,遍历文档中所有段落和表格,将占位符替换为实际值,保存为新文件。
表格生成代码:使用 doc.add_table(rows, cols) 创建表格,设置 table.style = 'Table Grid' 添加边框,逐行填充数据。
图片插入:doc.add_picture('chart.png', width=Inches(5)) 设置图片宽度和位置。
提示:python-docx不支持直接查找{{}}占位符。需要遍历段落的runs,在run.text中替换。如果占位符被Word分成多个run,需要先合并runs
第四步:处理复杂数据
实际报告中数据通常不是简单的文本替换:
场景1:绩效数据表格
- 从Excel读取员工绩效数据(多个季度的KPI)
- 在Word中创建表格,设置表头样式
- 按季度填充数据行
- 最后一行添加年度汇总
- 设置条件格式:达标绿色,未达标红色
场景2:图表插入
- 用matplotlib或pandas生成图表并保存为PNG
- 在Word文档中用add_picture插入
- 设置图片大小和居中对齐
- 添加图片标题
场景3:条件内容
- 根据数据条件决定是否显示某些段落
- 比如:绩效等级为A时,添加优秀表彰段落
- 用if判断控制内容生成
- 删除不需要的段落:
paragraph._element.getparent().remove(paragraph._element)
第五步:批量转PDF并发送邮件
生成Word后可自动转PDF并发邮件:
- Word转PDF:用docx2pdf库,一行代码
convert('report.docx') - 或者用LibreOffice命令行:
soffice --headless --convert-to pdf report.docx - 读取收件人列表:从Excel中获取邮箱
- 用smtplib发送邮件:附上PDF报告
- 记录发送状态:成功/失败记录到日志文件
完整自动化流程:
- 读取Excel数据 → 替换模板占位符 → 生成Word → 转PDF → 发邮件 → 记录日志
- 200份报告从生成到发送:全程约5分钟
常见问题与误区
- 占位符替换失败:Word可能在保存时将{{name}}拆分为多个run。解决方案:保存模板时用纯文本编辑器修改docx的XML,确保占位符在同一个run中
- 中文乱码:确保Python文件编码为UTF-8,读取Excel时指定encoding
- 表格样式丢失:python-docx对表格样式的控制有限。建议在模板中预设好表格,只填充数据
- 图片大小不对:用Inches或Cm指定尺寸,不要用像素
- docx2pdf需要Word:Windows需安装Microsoft Word,Linux用LibreOffice替代
- 大批量生成内存溢出:每生成一份后关闭Document对象,用
doc.save()后doc = None释放内存
效率数据
- 200份员工评价报告:手动16.7小时 → Python脚本30秒,效率提升2000倍
- 格式一致性:手动操作格式偏差率约5% → 脚本生成偏差率0%
- 错误率:手动填错数据约3% → 脚本从数据库读取0%错误
- 月度财务报告:50份分公司报告,手动2天 → 脚本2分钟
- 某HR团队实测:部署后每月节省约20小时报告制作时间