为什么用Python生成Word报告

典型场景:HR需要为200名员工生成年度评价报告,每份报告包含员工信息、绩效数据、发展建议。手动操作:打开模板 → 替换姓名 → 粘贴数据 → 调整格式 → 保存,每份约5分钟,200份需要16.7小时。用Python:写好脚本后,200份报告30秒生成,格式100%统一。

第一步:安装依赖库

  1. 安装核心库:pip install python-docx
  2. 安装Excel读取:pip install openpyxl pandas
  3. 安装PDF转换:pip install docx2pdf(Windows)或 pip install libreoffice(跨平台)
  4. 安装邮件发送:pip install secure-smtplib(如需自动发邮件)
  5. 验证安装:在Python中执行 from docx import Document 无报错即可

第二步:设计Word模板

模板是批量生成的基础,设计好模板后续只需填充数据:

  1. 在Word中创建报告模板,排版设定好字体、间距、页眉页脚
  2. 在需要替换的位置插入占位符标记:用双大括号包裹,如 {{name}}、{{department}}
  3. 表格位置用特殊标记:{{table_data}}
  4. 图片位置用标记:{{chart_image}}
  5. 保存为 template.docx

模板结构示例:

  • 标题:{{employee_name}} 年度评价报告
  • 基本信息表格:姓名、部门、岗位、入职日期
  • 绩效数据段落:{{performance_summary}}
  • 评价详情表格:{{evaluation_table}}
  • 发展建议:{{development_plan}}
  • 签名页:{{reviewer_name}} {{review_date}}

第三步:编写批量生成脚本

核心代码逻辑:

  1. 读取Excel数据源:员工信息表
  2. 遍历每行数据
  3. 复制模板,替换占位符
  4. 生成表格数据
  5. 插入图片(如有)
  6. 保存为单独的Word文件

关键代码片段(简化版):

from docx import Document
import 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:绩效数据表格

  1. 从Excel读取员工绩效数据(多个季度的KPI)
  2. 在Word中创建表格,设置表头样式
  3. 按季度填充数据行
  4. 最后一行添加年度汇总
  5. 设置条件格式:达标绿色,未达标红色

场景2:图表插入

  1. 用matplotlib或pandas生成图表并保存为PNG
  2. 在Word文档中用add_picture插入
  3. 设置图片大小和居中对齐
  4. 添加图片标题

场景3:条件内容

  1. 根据数据条件决定是否显示某些段落
  2. 比如:绩效等级为A时,添加优秀表彰段落
  3. 用if判断控制内容生成
  4. 删除不需要的段落:paragraph._element.getparent().remove(paragraph._element)

第五步:批量转PDF并发送邮件

生成Word后可自动转PDF并发邮件:

  1. Word转PDF:用docx2pdf库,一行代码 convert('report.docx')
  2. 或者用LibreOffice命令行:soffice --headless --convert-to pdf report.docx
  3. 读取收件人列表:从Excel中获取邮箱
  4. 用smtplib发送邮件:附上PDF报告
  5. 记录发送状态:成功/失败记录到日志文件

完整自动化流程:

  • 读取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小时报告制作时间