本文目录导读:

我来介绍几种在Python中生成Word文档的常用方法:
使用 python-docx 库(最常用)
安装
pip install python-docx
基本使用示例
from docx import Document
from docx.shared import Pt, Inches, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_TABLE_ALIGNMENT
# 创建文档
doc = Document()
# 1. 添加标题
doc.add_heading('Python生成的Word文档', level=0)
# 2. 添加段落
p = doc.add_paragraph('这是一段普通文本。')
p.add_run('这是加粗文本。').bold = True
p.add_run('这是斜体文本。').italic = True
# 3. 设置字体和颜色
run = p.add_run('红色字体')
run.font.color.rgb = RGBColor(255, 0, 0)
run.font.size = Pt(14)
run.font.name = '微软雅黑'
# 4. 添加标题
doc.add_heading('第一部分:数据报告', level=1)
doc.add_heading('1.1 数据分析', level=2)
# 5. 添加列表
doc.add_paragraph('项目一', style='List Bullet')
doc.add_paragraph('项目二', style='List Bullet')
doc.add_paragraph('项目三', style='List Number')
# 6. 添加表格
table = doc.add_table(rows=3, cols=4, style='Table Grid')
# 设置表格对齐方式
table.alignment = WD_TABLE_ALIGNMENT.CENTER
# 填充表格数据
data = [
['姓名', '年龄', '城市', '职业'],
['张三', 28, '北京', '工程师'],
['李四', 32, '上海', '设计师']
]
for i, row_data in enumerate(data):
for j, cell_data in enumerate(row_data):
table.rows[i].cells[j].text = str(cell_data)
# 7. 添加图片
doc.add_picture('example.png', width=Inches(4.0))
# 8. 添加分页符
doc.add_page_break()
# 9. 添加带样式的段落
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run('居中显示的文字')
run.font.size = Pt(16)
run.bold = True
# 10. 保存文档
doc.save('output.docx')
print("Word文档已生成:output.docx")
高级功能示例
from docx import Document
from docx.shared import Pt, Inches, Cm, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.oxml.ns import qn
import datetime
def create_report_document():
"""创建复杂的报告文档"""
doc = Document()
# 设置默认字体
style = doc.styles['Normal']
font = style.font
font.name = '微软雅黑'
font.size = Pt(11)
style.element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑')
# 添加页眉
header = doc.sections[0].header
header_para = header.paragraphs[0]
header_para.text = "数据分析报告 - 机密"
header_para.alignment = WD_ALIGN_PARAGRAPH.RIGHT
# 添加封面
doc.add_paragraph()
doc.add_paragraph()
# 封面标题= doc.add_paragraph()alignment = WD_ALIGN_PARAGRAPH.CENTER
run = title.add_run('数据分析报告')
run.font.size = Pt(26)
run.bold = True
run.font.color.rgb = RGBColor(0, 51, 102)
doc.add_paragraph()
# 封面信息
info_data = [
f'生成日期:{datetime.datetime.now().strftime("%Y年%m月%d日")}',
'版本:V1.0',
'制作者:Python自动化'
]
for info in info_data:
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run(info)
run.font.size = Pt(14)
doc.add_page_break()
# 添加目录页(手动)
doc.add_heading('目录', level=1)
content_list = ['1. 概述', '2. 数据统计', '3. 图表分析', '4. 结论与建议']
for item in content_list:
p = doc.add_paragraph(item)
p.paragraph_format.space_after = Pt(6)
doc.add_page_break()
# 正文内容
doc.add_heading('1. 概述', level=1)
doc.add_paragraph(
'本报告基于2024年第一季度数据,对销售业绩进行了全面分析。'
'通过数据挖掘和统计分析,我们发现了多个重要的业务增长点。'
)
# 添加表格数据
doc.add_heading('2. 季度销售数据', level=2)
# 创建样式化的表格
table = doc.add_table(rows=5, cols=4)
table.style = 'Medium Shading 1 Accent 1'
# 表头
headers = ['月份', '销售额(万)', '利润(万)', '增长率']
for i, header in enumerate(headers):
cell = table.rows[0].cells[i]
cell.text = header
cell.paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
# 数据
data = [
['1月', '120', '30', '15%'],
['2月', '150', '45', '25%'],
['3月', '180', '60', '35%'],
['合计', '450', '135', '—']
]
for i, row_data in enumerate(data, 1):
for j, value in enumerate(row_data):
cell = table.rows[i].cells[j]
cell.text = value
cell.paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
# 设置表格宽度
for row in table.rows:
for cell in row.cells:
cell.width = Inches(1.5)
doc.add_paragraph() # 添加空行
# 添加列表
doc.add_heading('3. 关键发现', level=2)
findings = [
'第一季度整体销售业绩稳步增长',
'2月份表现突出,增长率达到25%',
'产品B在华东地区表现最佳'
]
for finding in findings:
doc.add_paragraph(finding, style='List Bullet')
# 添加页脚
footer = doc.sections[0].footer
footer_para = footer.paragraphs[0]
footer_para.text = "第 1 页" # 实际应用中需要页码字段
# 保存文档
doc.save('数据分析报告.docx')
print("报告文档已生成:数据分析报告.docx")
# 运行函数
create_report_document()
使用模板生成文档
from docx import Document
from docx.shared import Pt, Inches
import json
def generate_from_template():
"""使用模板生成文档"""
# 读取模板
template_path = 'template.docx'
doc = Document(template_path)
# 数据字典
data = {
'{{name}}': '张三',
'{{date}}': '2024-01-15',
'{{department}}': '技术部',
'{{content}}': '这是一个使用模板生成的文档示例。'
}
# 替换文档中的占位符
for paragraph in doc.paragraphs:
for key, value in data.items():
if key in paragraph.text:
paragraph.text = paragraph.text.replace(key, value)
# 保持字体格式
for run in paragraph.runs:
if key in run.text:
run.text = run.text.replace(key, value)
# 处理表格中的占位符
for table in doc.tables:
for row in table.rows:
for cell in row.cells:
for key, value in data.items():
if key in cell.text:
cell.text = cell.text.replace(key, value)
doc.save('generated_from_template.docx')
print("模板文档已生成")
# 运行函数
generate_from_template()
批量生成文档
import os
from docx import Document
def batch_generate_documents():
"""批量生成多个文档"""
employees = [
{'name': '张三', 'department': '技术部', 'salary': 15000},
{'name': '李四', 'department': '市场部', 'salary': 12000},
{'name': '王五', 'department': '财务部', 'salary': 13000}
]
# 创建输出目录
output_dir = 'employee_reports'
os.makedirs(output_dir, exist_ok=True)
for emp in employees:
doc = Document()
# 添加内容
doc.add_heading(f'{emp["name"]} - 个人信息报告', level=1)
doc.add_paragraph(f'姓名:{emp["name"]}')
doc.add_paragraph(f'部门:{emp["department"]}')
doc.add_paragraph(f'薪资:{emp["salary"]}元')
# 保存文件
filename = f'{output_dir}/{emp["name"]}_报告.docx'
doc.save(filename)
print(f"已生成:{filename}")
# 运行函数
batch_generate_documents()
使用其他库
docxtpl - 模板引擎方式
pip install docxtpl
from docxtpl import DocxTemplate
def use_docxtpl():
"""使用docxtpl模板引擎"""
doc = DocxTemplate("template.docx")
context = {
'name': '张三',
'date': '2024-01-15',
'items': [
{'desc': '项目A', 'price': 100},
{'desc': '项目B', 'price': 200},
{'desc': '项目C', 'price': 300}
],
'total': 600
}
doc.render(context)
doc.save("docxtpl_output.docx")
# 注:需要先创建包含模板语法的template.docx
注意事项
- 字体兼容性:在不同系统上,某些字体可能不可用
- 图片路径:添加图片时确保路径正确
- 样式管理:合理使用样式可以保持文档一致性
- 内存管理:处理大文档时注意内存使用
- 版本兼容:python-docx支持.docx格式,不支持.doc格式
- python-docx:功能最全面,支持大部分Word操作
- docxtpl:适合模板化文档生成
- 可以根据需求选择合适的库和方法
这些示例涵盖了大多数常见的Word文档生成需求,你可以根据具体场景选择合适的方法。