合同模板、证明模板、报告模板...每次都要手动改内容?这一节讲如何用 Python 自动填充 Word 模板、读取 PDF 内容、批量转换格式。让文档处理像填表一样简单。
1. Word 文档自动化
python-docx 库
安装:
bash
pip install python-docx
读取 Word
python
from docx import Document
doc = Document("合同.docx")
# 读取所有段落
for para in doc.paragraphs:
print(para.text)
# 读取表格
for table in doc.tables:
for row in table.rows:
for cell in row.cells:
print(cell.text)
写入 Word
python
from docx import Document
from docx.shared import Pt, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
doc = Document()
# 添加标题
doc.add_heading("测试文档", 0)
# 添加段落
p = doc.add_paragraph("这是第一段")
p.add_run("这是加粗").bold = True
# 添加表格
table = doc.add_table(rows=2, cols=3)
table.style = "Light Grid Accent 1"
# 填充表格数据
data = [("姓名", "年龄", "部门"), ("张三", "28", "技术部")]
for i, row_data in enumerate(data):
row = table.rows[i]
for j, cell_data in enumerate(row_data):
row.cells[j].text = cell_data
# 保存
doc.save("输出.docx")
2. 模板填充
基础模板替换
python
from docx import Document
# 准备数据
data = {
"name": "张三",
"id": "2024001",
"date": "2024年1月15日",
"amount": "壹万元整"
}
# 加载模板
doc = Document("合同模板.docx")
# 替换占位符
for para in doc.paragraphs:
for key, value in data.items():
if f"{{{key}}}" in para.text:
para.text = para.text.replace(f"{{{key}}}", value)
# 处理表格中的占位符
for table in doc.tables:
for row in table.rows:
for cell in row.cells:
for key, value in data.items():
if f"{{{key}}}" in cell.text:
cell.text = cell.text.replace(f"{{{key}}}", value)
doc.save(f"合同_{data['name']}.docx")
批量生成
python
from docx import Document
import pandas as pd
# 读取员工名单
df = pd.read_excel("员工名单.xlsx")
# 加载模板
template = Document("合同模板.docx")
# 批量生成
for _, row in df.iterrows():
doc = Document()
# 复制模板内容到新文档
for para in template.paragraphs:
doc.add_paragraph(para.text)
# 替换数据
for para in doc.paragraphs:
para.text = para.text.replace("{name}", str(row["姓名"]))
para.text = para.text.replace("{id}", str(row["工号"]))
# 保存
doc.save(f"合同_{row['姓名']}.docx")
print(f"已生成 {len(df)} 份合同")
3. PDF 处理
PDF 读取
安装:
bash
pip install pypdf
python
from pypdf import PdfReader
reader = PdfReader("报告.pdf")
# 读取所有页面
for i, page in enumerate(reader.pages):
text = page.extract_text()
print(f"--- 第{i+1}页 ---")
print(text[:500]) # 只打印前500字符
PDF 写入
安装:
bash
pip install reportlab
python
from reportlab.lib.pagesizes import A4
from reportlab.pdfgen import canvas
c = canvas.Canvas("报告.pdf", pagesize=A4)
c.drawString(100, 800, "Hello PDF!")
c.save()
Word 转 PDF
需要安装 Word 应用(Windows):
python
import win32com.client
import os
def word_to_pdf(word_path, pdf_path):
word = win32com.client.Dispatch("Word.Application")
word.Visible = False
doc = word.Documents.Open(os.path.abspath(word_path))
doc.SaveAs(os.path.abspath(pdf_path), 17) # 17 = PDF format
doc.Close()
word.Quit()
word_to_pdf("合同.docx", "合同.pdf")
4. 格式转换
Excel 转 Word 报告
python
import pandas as pd
from docx import Document
from docx.shared import Inches
# 读取数据
df = pd.read_excel("销售数据.xlsx")
# 创建 Word 文档
doc = Document()
doc.add_heading("销售报告", 0)
# 添加文字
doc.add_paragraph(f"生成时间: 2024年1月15日")
doc.add_paragraph(f"总计销售额: {df['销售额'].sum():,.2f} 元")
# 添加表格
table = doc.add_table(rows=1, cols=3)
table.style = "Light Grid Accent 1"
# 表头
header_cells = table.rows[0].cells
header_cells[0].text = "产品"
header_cells[1].text = "销量"
header_cells[2].text = "销售额"
# 数据行
for _, row in df.iterrows():
row_cells = table.add_row().cells
row_cells[0].text = str(row["产品"])
row_cells[1].text = str(row["销量"])
row_cells[2].text = str(row["销售额"])
doc.save("销售报告.docx")
多格式批量转换
python
import os
from pathlib import Path
input_dir = Path("待转换")
output_dir = Path("已转换")
output_dir.mkdir(exist_ok=True)
for file in input_dir.glob("*.docx"):
# 转 PDF
pdf_path = output_dir / f"{file.stem}.pdf"
word_to_pdf(str(file), str(pdf_path))
# 转 HTML
html_path = output_dir / f"{file.stem}.html"
# 使用 mammoth 库
import mammoth
with open(file, "rb") as docx:
result = mammoth.convert_to_html(docx)
with open(html_path, "wb") as html:
html.write(result.value.encode())
print("转换完成!")
5. 实战:批量生成证明
python
from docx import Document
from docx.shared import Pt, RGBColor
import pandas as pd
# 读取员工数据
df = pd.read_excel("员工信息.xlsx")
# 模板内容
template_text = """
在职证明
兹证明 {name}(身份证号:{id})为我公司员工,
于 {join_date} 入职,现担任 {position} 一职。
特此证明。
公司名称:北京科技有限公司
日期:{date}
"""
for _, row in df.iterrows():
# 替换占位符
content = template_text.format(
name=row["姓名"],
id=row["身份证号"],
join_date=row["入职日期"],
position=row["职位"],
date="2024年1月"
)
# 创建文档
doc = Document()
doc.add_paragraph(content)
# 设置格式
for para in doc.paragraphs:
para.paragraph_format.line_spacing = 1.5
# 保存
doc.save(f"证明_{row['姓名']}.docx")
print(f"已生成 {len(df)} 份证明")
6. 注意事项
| 问题 | 解决方案 |
|---|---|
| Word 模板占位符不生效 | 确认占位符格式,如 {name} |
| 批量生成速度慢 | 使用 python-docx 更快,win32com 较慢 |
| PDF 中文乱码 | 使用支持中文的字体 |
| 转换后格式丢失 | 检查转换库的兼容性 |
小结
| 学会的 | 要点 |
|---|---|
| Word 读取 | python-docx 读取段落和表格 |
| Word 写入 | 添加标题、段落、表格 |
| 模板填充 | 批量替换占位符 |
| PDF 读取 | pypdf 提取文字 |
| 格式转换 | Word↔PDF、Word↔HTML |
下节预告
第3节:数据分析与可视化------数据清洗、图表生成、自动报告
📺 系列文章: 智能办公自动化
- 第1节:Excel 自动化(已发布)
- 第2节:Word/PDF 文档处理(本文)
- 第3节:数据分析与可视化(待发布)
- 第4节:邮件与消息自动化(待发布)
- 第5节:综合实战:周报一键生成(待发布)