Py学习  »  Python

一招搞定Word文档!Python-docx库让你告别繁琐操作

A逍遥之路 • 3 月前 • 145 次点击  

大家好!今天我要分享一个绝对实用的Python库——python-docx。如果你经常需要处理Word文档,但又烦透了重复性的操作,那这篇文章绝对不能错过!

不管你是刚入门Python的新手,还是寻找提高工作效率的老鸟,python-docx库都能让你的文档处理工作变得又快又好。接下来,我会用最直白的语言,带你一步步掌握这个强大工具。

python-docx能帮你:

  • 自动生成格式统一的文档

  • 批量处理大量Word文件

  • 从数据库或Excel提取数据并生成报告

  • 精确控制文档格式、样式和布局

  • 在现有文档中插入内容

听起来是不是很心动?那就赶紧跟着我学起来!

准备工作

首先,我们需要安装python-docx库:

pip install python-docx

安装完成后,我们就可以开始使用了。记住,导入这个库的正确方式是:

from docx import Document

千万别写成import docx哦,这是初学者容易犯的错误。

基础操作:创建你的第一个Word文档

下面是一个最简单的例子,创建一个包含标题和段落的Word文档:

from docx import Document

# 创建一个新的Document对象
doc = Document()

# 添加标题
doc.add_heading('我的第一个Word文档'0)

# 添加段落
doc.add_paragraph('这是使用python-docx创建的第一个段落,是不是很简单?')

# 添加带格式的段落
p = doc.add_paragraph('你还可以添加')
p.add_run('粗体').bold = True
p.add_run('和')
p.add_run('斜体').italic = True
p.add_run('文本。')

# 保存文档
doc.save('我的第一个文档.docx')

运行这段代码,你会在当前目录下看到一个名为"我的第一个文档.docx"的文件。打开看看,是不是很神奇?

玩转段落和文本

段落是Word文档的基本组成部分。在python-docx中,我们可以精确控制段落的样式:

from docx import Document
from docx.shared import PtRGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH

doc = Document()

# 添加标题
doc.add_heading('段落和文本格式控制'1)

# 创建一个段落
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER  # 设置居中对齐

# 在段落中添加文本
run = p.add_run('这是一段居中对齐的彩色文本')
run.font.size = Pt(14)  # 设置字体大小为14磅
run.font.name = '宋体'  # 设置字体
run.font.color.rgb = RGBColor(25500)  # 设置红色

# 保存文档
doc.save('段落和文本格式.docx')

你看,我们可以控制对齐方式、字体、大小、颜色等多种属性。

添加表格

表格是展示数据的好方法,python-docx让创建表格变得超级简单:

from docx import Document
from docx.shared import Cm

doc = Document()

doc.add_heading('表格示例'1)

# 创建一个3行4列的表格
table = doc.add_table(rows=3cols=4)
table.style = 'Table Grid'  # 设置表格样式

# 获取单元格并填充内容
cell = table.cell(00)
cell.text = '左上角单元格'

# 填充第一行
heading_cells = table.rows[0].cells
heading_cells[0].text = '姓名'
heading_cells[1].text = '年龄'
heading_cells[ 2].text = '城市'
heading_cells[3].text = '职业'

# 填充数据行
data = [
    ['张三''25''北京''程序员'],
    ['李四''30''上海''设计师']
]

for irow_data in enumerate(data):
    row = table.rows[i+1]  # 跳过标题行
    for jval in enumerate(row_data):
        row.cells[j].text = val

# 设置表格列宽
for cell in table.columns[0].cells:
    cell.width = Cm(3)

doc.add_paragraph('表格创建完成!')

doc.save('表格示例.docx')

插入图片

文档中插入图片也是常见需求,python-docx同样能轻松实现:

from docx import Document
from docx.shared import Inches

doc = Document()

doc.add_heading('图片示例'1)

doc.add_paragraph('下面是一张插入的图片:')

# 插入图片,宽度为5英寸
doc.add_picture('example.jpg'width=Inches(5))
# 注意:运行前请确保当前目录下有名为example.jpg的图片

doc.add_paragraph('图片插入成功!')

doc.save('图片示例.docx')

提示:如果你没有准备图片,可以将上面代码中的'example.jpg'替换为你电脑上任意一张图片的路径。

实用案例:自动生成成绩单

学完基础操作,我们来做一个实际案例——自动生成学生成绩单:

from docx import Document
from docx.shared import PtCm
from  docx.enum.text import WD_ALIGN_PARAGRAPH

# 学生数据
students = [
    {'name''张三''id''2021001''scores': {'语文'88'数学'92'英语'85'物理'90'化学'87}},
    {'name''李四''id''2021002''scores': {'语文'75'数学'96'英语'90'物理'88'化学'92}}
]

for student in students:
    # 为每个学生创建一个新文档
    doc = Document()
    
    # 添加标题
    title = doc.add_heading('学生成绩单'0)
    title.alignment = WD_ALIGN_PARAGRAPH.CENTER
    
    # 添加学生信息
    info_para = doc.add_paragraph()
    info_para.alignment = WD_ALIGN_PARAGRAPH.CENTER
    info_run = info_para. add_run(f"姓名:{student['name']}    学号:{student['id']}")
    info_run.font.size = Pt(12)
    
    doc.add_paragraph()  # 空行
    
    # 添加成绩表格
    table = doc.add_table(rows=len(student['scores'])+1cols=3)
    table.style = 'Table Grid'
    
    # 设置表头
    heading_cells = table.rows[0].cells
    heading_cells[0].text = '科目'
    heading_cells[1].text = '分数'
    heading_cells[2].text = '等级'
    
    # 为表头设置居中对齐
    for cell in heading_cells:
        cell_para = cell.paragraphs[0]
        cell_para.alignment = WD_ALIGN_PARAGRAPH. CENTER
        cell_run = cell_para.runs[0]
        cell_run.font.bold = True
    
    # 填充成绩数据
    for i, (subjectscorein enumerate(student['scores'].items()):
        row = table.rows[i+1]
        row.cells[0].text = subject
        row.cells[1].text = str(score)
        
        # 根据分数确定等级
        if score >= 90:
            grade = 'A'
        elif score >= 80:
            grade = 'B'
        elif score >= 70:
            grade = 'C'
        elif score >= 60:
            grade = 'D'
        else:
            grade = 'F'
        
        row.cells[2].text = grade
        
        # 设置居中对齐
        for cell in row.cells:
            cell.paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
    
    # 设置列宽
    for cell in table.columns[0].cells:
        cell.width = Cm(4)
    for cell in table.columns[1].cells:
        cell.width = Cm(4)
    for cell in table.columns[2].cells:
        cell.width = Cm(4)
    
    # 添加总评
    doc.add_paragraph()
    total_score = sum(student['scores'].values())
    average = total_score / len(student['scores'])
    
    summary = doc.add_paragraph()
    summary.add_run(f'总分:{total_score}    平均分:{average:.1f}').bold = True
    
    # 添加评语
    doc.add_paragraph()
    comment = doc.add_paragraph('评语:')
    if average >= 90:
        comment.add_run('表现优异,继续保持!')
    elif average >= 80:
        comment.add_run('表现良好,仍有提升空间。')
    elif average >= 70:
        comment.add_run('表现一般,需要更加努力。')
    else:
        comment.add_run('需要加强学习,请及时调整。')
    
    # 添加签名行
    doc.add_paragraph()
    doc.add_paragraph()
    signature = doc.add_paragraph('班主任签名:________________        日期:________________' )
    signature.alignment = WD_ALIGN_PARAGRAPH.RIGHT
    
    # 保存文档
    doc.save(f'{student["name"]}成绩单.docx')

print("所有成绩单已生成完毕!")

运行这段代码,你会得到两个Word文档,分别是"张三成绩单.docx"和"李四成绩单.docx"。这个例子展示了如何将数据转化为格式化的文档,你可以轻松扩展它来处理更多学生的数据。

进阶应用:直接使用数据生成销售报告

在实际工作中,我们经常需要直接使用数据生成Word报告。下面是一个不依赖Excel文件的例子,直接使用Python数据结构来生成销售报告:

from docx import Document
from docx.shared import Pt, Cm
from docx.enum.text import WD_ALIGN_PARAGRAPH

# 直接在代码中定义销售数据,避免Excel依赖问题
sales_data = {
    '产品': ['笔记本电脑', '智能手机', '平板电脑', '智能手表', '蓝牙耳机'],
    '一季度': [15000, 25000, 8000, 5000, 10000],
    '二季度': [18000, 27000, 7500, 6000, 12000],
    '三季度': [21000, 30000, 9000, 7000, 15000],
    '四季度': [25000, 35000, 10000, 8000, 18000]
}

# 创建Word文档
doc = Document()

# 添加标题
title = doc.add_heading('2024年度销售报告', 0)
title.alignment = WD_ALIGN_PARAGRAPH.CENTER

# 添加简介
doc.add_paragraph('本报告汇总了2024年各季度主要产品的销售情况,包括销售额和同比分析。')

# 添加销售数据表格
doc.add_heading('销售数据明细', level=1)
table = doc.add_table(rows=len(sales_data['产品'])+1, cols=len(sales_data.keys()))
table.style = 'Table Grid'

# 添加表头
for i, column in enumerate(sales_data.keys()):
    table.cell(0, i).text = column
    # 设置表头格式
    cell_para = table.cell(0, i).paragraphs[0]
    cell_para.alignment = WD_ALIGN_PARAGRAPH.CENTER
    for run in cell_para.runs:
        run.font.bold = True

# 添加数据
for i in range(len(sales_data['产品'])):
    for j, key in enumerate(sales_data.keys()):
        value = sales_data[key][i]
        if isinstance(value, (int, float)):
            table.cell(i+1, j).text = f"{value:,}"  # 数字格式化,添加千位分隔符
        else:
            table.cell(i+1, j).text = str(value)
        # 居中对齐
        table.cell(i+1, j).paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER

# 添加销售分析
doc.add_heading('销售分析', level=1)

# 计算每个产品的年度总销售额
annual_totals = []
for i in range(len(sales_data['产品'])):
    total = sales_data['一季度'][i] + sales_data['二季度'][i] + sales_data['三季度'][i] + sales_data['四季度'][i]
    annual_totals.append(total)

# 计算最畅销产品
max_sales_index = annual_totals.index(max(annual_totals))
best_product = sales_data['产品'][max_sales_index]
best_product_sales = annual_totals[max_sales_index]

# 计算增长最快的产品
growth_rates = []
for i in range(len(sales_data['产品'])):
    growth = (sales_data['四季度'][i] - sales_data['一季度'][i]) / sales_data['一季度'][i] * 100
    growth_rates.append(growth)

max_growth_index = growth_rates.index(max(growth_rates))
fastest_growth_product = sales_data['产品'][max_growth_index]
fastest_growth_rate = growth_rates[max_growth_index]

analysis = doc.add_paragraph()
analysis.add_run(f"2024年销售总额达到{sum(annual_totals):,}元,其中最畅销的产品是{best_product},全年销售额达到{best_product_sales:,}元。").bold = False
analysis.add_run(f"\n\n增长最快的产品是{fastest_growth_product},从一季度到四季度增长了{fastest_growth_rate:.1f}%。").bold = False

# 添加季度对比分析
doc.add_heading('季度销售对比', level=1)
quarters = ['一季度', '二季度', '三季度', '四季度']
quarter_totals = [sum(sales_data[q]) for q in quarters]

para = doc.add_paragraph()
para.add_run(f"一季度总销售额:{quarter_totals[0]:,}元\n").bold = True
para.add_run(f"二季度总销售额:{quarter_totals[1]:,}元(环比增长:{(quarter_totals[1]-quarter_totals[0])/quarter_totals[0]*100:.1f}%)\n").bold = True
para.add_run(f"三季度总销售额:{quarter_totals[2]:,}元(环比增长:{(quarter_totals[2]-quarter_totals[1])/quarter_totals[1]*100:.1f}%)\n").bold = True
para.add_run(f"四季度总销售额:{quarter_totals[3]:,}元(环比增长:{(quarter_totals[3]-quarter_totals[2])/quarter_totals[2]*100:.1f}%)\n").bold = True

# 添加总结
doc.add_heading('总结与展望', level=1)
conclusion = doc.add_paragraph()
conclusion.add_run("根据销售数据分析,我们的产品在市场上表现良好,尤其是智能手机和笔记本电脑系列。四个季度均呈现稳定增长趋势,这表明我们的市场策略是成功的。").bold = False
conclusion.add_run("\n\n2025年,我们将继续扩大智能手机和笔记本电脑的市场份额,同时加大对智能手表和蓝牙耳机的推广力度,预计销售额将实现15%-20%的增长。").bold = False

# 保存文档
doc.save('2024年度销售报告.docx')
print("销售报告已生成完毕!")

如果你确实需要从Excel读取数据,请先确保安装了必要的库:

pip install python-docx pandas openpyxl

openpyxl是pandas读取Excel文件所需的依赖库。

这个例子展示了如何从Excel文件读取数据,然后生成一份包含表格、数据分析和图表的专业报告。你可以根据自己的需求进一步完善这个报告。

通过本文的学习,你已经掌握了python-docx的基本用法和一些实用技巧。无论是创建新文档、处理已有文档,还是批量生成报告,python-docx都能帮你轻松实现。

几点使用建议:

  1. 对于复杂的文档格式,可以先在Word中创建一个模板,然后用python-docx修改内容。

  2. 处理大量文档时,使用多线程可以提高效率。

  3. 如果需要更复杂的排版,可以考虑结合其他库如PyWin32。

  4. 对于表格操作,结合pandas可以事半功倍。

如果你觉得这篇文章有用,别忘了点赞、收藏和分享哦!有什么问题也欢迎在评论区留言讨论。

下期预告:《Python自动化办公的另一大利器——openpyxl库详解》,敬请期待!

扫描下方二维码,备注【WORD】,获取完整示例代码!

转发、收藏、在看,是对作者最大的鼓励!👏
关注逍遥不迷路,Python知识日日补!






           对Python,AI,自动化办公提效,副业发展等感兴趣的伙伴们,扫码添加逍遥,限免交流群

备注【成长交流】

图片



Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/180764
 
145 次点击