Python案例如何生成Word文档?

wen python案例 10

本文目录导读:

Python案例如何生成Word文档?

  1. 使用 python-docx 库(最常用)
  2. 高级功能示例
  3. 使用模板生成文档
  4. 批量生成文档
  5. 使用其他库
  6. 注意事项

我来介绍几种在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

注意事项

  1. 字体兼容性:在不同系统上,某些字体可能不可用
  2. 图片路径:添加图片时确保路径正确
  3. 样式管理:合理使用样式可以保持文档一致性
  4. 内存管理:处理大文档时注意内存使用
  5. 版本兼容:python-docx支持.docx格式,不支持.doc格式
  • python-docx:功能最全面,支持大部分Word操作
  • docxtpl:适合模板化文档生成
  • 可以根据需求选择合适的库和方法

这些示例涵盖了大多数常见的Word文档生成需求,你可以根据具体场景选择合适的方法。

抱歉,评论功能暂时关闭!