大家好!今天我要分享一个绝对实用的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 Pt, RGBColor
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(255, 0, 0) # 设置红色
# 保存文档
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=3, cols=4)
table.style = 'Table Grid' # 设置表格样式
# 获取单元格并填充内容
cell = table.cell(0, 0)
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 i, row_data in enumerate(data):
row = table.rows[i+1] # 跳过标题行
for j, val 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 Pt, Cm
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'])+1, cols=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, (subject, score) in 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都能帮你轻松实现。
几点使用建议:
对于复杂的文档格式,可以先在Word中创建一个模板,然后用python-docx修改内容。
处理大量文档时,使用多线程可以提高效率。
如果需要更复杂的排版,可以考虑结合其他库如PyWin32。
对于表格操作,结合pandas可以事半功倍。
如果你觉得这篇文章有用,别忘了点赞、收藏和分享哦!有什么问题也欢迎在评论区留言讨论。
下期预告:《Python自动化办公的另一大利器——openpyxl库详解》,敬请期待!
扫描下方二维码,备注【WORD】,获取完整示例代码!
对Python,AI,自动化办公提效,副业发展等感兴趣的伙伴们,扫码添加逍遥,限免交流群
备注【成长交流】