第40课:Python|办公自动化【Excel/Word/PPT批量处理零基础实战】

在这里插入图片描述

文章目录


📖 开篇导读

在日常工作中,我们经常会遇到大量重复的办公文档处理任务:每月需要从多个Excel报表中汇总数据;需要批量生成上百份格式相同的Word合同;需要根据数据动态生成PPT演示文稿……这些工作如果手工操作,既繁琐又容易出错。而Python提供了强大的第三方库,可以自动化处理这些文档,让办公效率提升数倍。

💡 工作场景

  • 财务/数据分析:合并多个Excel文件、生成数据透视图。
  • 行政/人事:批量生成员工工资条、录用通知书。
  • 销售/市场:根据模板自动生成产品报价单、演示文稿。
  • 教育:批量生成学生成绩单、结业证书。

本课将学习三个核心库:

  • openpyxl:读写Excel 2010+文件(.xlsx),支持单元格样式、公式、图表、数据验证。
  • python-docx:读写Word文档,操作段落、表格、样式、页眉页脚。
  • python-pptx:创建和修改PowerPoint演示文稿,添加幻灯片、文本框、图表、图片。

学完本课,你将能够用Python解放双手,告别重复枯燥的文档处理。


🎯 学习目标

目标编号具体掌握内容对应面试/工作价值
1️⃣安装openpyxlpython-docxpython-pptx环境配置
2️⃣使用openpyxl读取、写入Excel,操作单元格、行列、样式、公式、图表数据处理自动化
3️⃣使用python-docx生成Word文档,添加段落、表格、图片、分页报表、合同生成
4️⃣使用python-pptx创建演示文稿,添加幻灯片、标题、内容、图表自动化汇报材料
5️⃣掌握批量处理文件夹下所有相关文件的方法提高工作效率
6️⃣能够综合运用三个库解决实际问题独立开发办公自动化脚本

🔥 面试考点:“如何用Python批量修改Excel文件?”“Word模板生成文档的原理?”“Python操作PPT有哪些常用库?”


📚 知识点理论精讲

一、openpyxl —— Excel自动化处理

1.1 安装

pip install openpyxl

1.2 核心概念

  • Workbook:工作簿,对应一个Excel文件。
  • Worksheet:工作表,即Sheet页。
  • Cell:单元格,通过行列坐标定位。
  • Row/Column:行和列。

1.3 读取Excel文件

from openpyxl import load_workbook

# 加载工作簿
wb = load_workbook('data.xlsx')
# 获取工作表
ws = wb.active               # 获取激活的工作表
ws = wb['Sheet1']             # 按名称获取
# 读取单元格
cell = ws['A1']               # 方式1
cell = ws.cell(row=1, column=1)  # 方式2
print(cell.value)
# 遍历行
for row in ws.iter_rows(min_row=2, values_only=True):
    print(row)

1.4 写入Excel文件

from openpyxl import Workbook

wb = Workbook()
ws = wb.active
ws.title = "学生成绩"          # 修改工作表名
ws['A1'] = "姓名"
ws['B1'] = "分数"
ws.append(["张三", 85])        # 追加一行
ws.append(["李四", 92])
wb.save('成绩表.xlsx')

1.5 样式设置

from openpyxl.styles import Font, PatternFill, Alignment, Border, Side

# 字体
bold_font = Font(bold=True, color='FF0000', size=12)
ws['A1'].font = bold_font

# 填充色
fill = PatternFill(start_color='FFFF00', end_color='FFFF00', fill_type='solid')
ws['B1'].fill = fill

# 对齐
center_alignment = Alignment(horizontal='center', vertical='center')
ws['C1'].alignment = center_alignment

# 边框
thin_border = Border(left=Side(style='thin'), right=Side(style='thin'),
                     top=Side(style='thin'), bottom=Side(style='thin'))
ws['D1'].border = thin_border

1.6 公式

ws['C2'] = "=A2+B2"          # 写入公式
wb.save('formula.xlsx')

1.7 图表

from openpyxl.chart import BarChart, Reference

# 创建柱状图
chart = BarChart()
data = Reference(ws, min_col=2, min_row=1, max_row=10, max_col=2)
categories = Reference(ws, min_col=1, min_row=2, max_row=10)
chart.add_data(data, titles_from_data=True)
chart.set_categories(categories)
ws.add_chart(chart, "E2")

1.8 合并/拆分单元格

ws.merge_cells('A1:D1')       # 合并
ws.unmerge_cells('A1:D1')     # 拆分

二、python-docx —— Word文档处理

2.1 安装

pip install python-docx

2.2 核心概念

  • Document:文档对象。
  • Paragraph:段落。
  • Run:一段连续样式相同的文本。
  • Table:表格。
  • Section:节(页面设置)。

2.3 创建与保存

from docx import Document

doc = Document()
doc.add_heading('报告标题', level=1)
doc.add_paragraph('这是第一段文字。')
doc.save('report.docx')

2.4 添加不同格式的文本

p = doc.add_paragraph('普通文本')
run = p.add_run('加粗文本')
run.bold = True
run = p.add_run('斜体文本')
run.italic = True
run = p.add_run('下划线')
run.underline = True

2.5 添加表格

table = doc.add_table(rows=3, cols=3)
table.style = 'Light Grid Accent 1'
# 填充数据
for i in range(3):
    for j in range(3):
        table.cell(i, j).text = f"({i},{j})"

2.6 添加图片

doc.add_picture('logo.png', width=Inches(1.5))

2.7 分页

doc.add_page_break()

2.8 读取现有文档

doc = Document('existing.docx')
for para in doc.paragraphs:
    print(para.text)

三、python-pptx —— PPT自动化

3.1 安装

pip install python-pptx

3.2 创建与保存

from pptx import Presentation

prs = Presentation()
slide_layout = prs.slide_layouts[0]  # 标题幻灯片
slide = prs.slides.add_slide(slide_layout)
title = slide.shapes.title
title.text = "Python自动化PPT"
subtitle = slide.placeholders[1]
subtitle.text = "by 课程作者"
prs.save('presentation.pptx')

3.3 常用幻灯片布局索引

索引类型
0标题幻灯片
1标题和内容
2节标题
3两栏内容
4比较
5仅标题
6空白
7内容与标题
8图片与标题

3.4 添加内容

# 标题和内容布局
slide = prs.slides.add_slide(prs.slide_layouts[1])
slide.shapes.title.text = "核心知识点"
content = slide.placeholders[1]
content.text = "• 第一点\n• 第二点\n• 第三点"

3.5 添加图片

slide = prs.slides.add_slide(prs.slide_layouts[6])  # 空白
left = Inches(1); top = Inches(1); width = Inches(5); height = Inches(4)
slide.shapes.add_picture('chart.png', left, top, width=width)

3.6 添加表格

from pptx.util import Inches
rows, cols = 3, 3
table = slide.shapes.add_table(rows, cols, Inches(1), Inches(2), Inches(6), Inches(2)).table
table.cell(0,0).text = "标题1"

3.7 修改现有PPT

prs = Presentation('template.pptx')
for slide in prs.slides:
    for shape in slide.shapes:
        if shape.has_text_frame:
            # 替换文本
            shape.text = shape.text.replace('{name}', '张三')
prs.save('modified.pptx')

💻 代码案例实操

案例1:Excel批量处理——合并多个工作簿

"""
merge_excel.py
将同一个文件夹下所有Excel文件的第一个工作表合并到一个文件中
"""

import os
from openpyxl import load_workbook, Workbook

def merge_excel_files(input_dir, output_file):
    """合并多个Excel文件"""
    merged_wb = Workbook()
    merged_ws = merged_wb.active
    merged_ws.title = "合并结果"
    
    header_written = False
    for filename in os.listdir(input_dir):
        if not filename.endswith('.xlsx'):
            continue
        filepath = os.path.join(input_dir, filename)
        wb = load_workbook(filepath)
        ws = wb.active
        rows = list(ws.iter_rows(values_only=True))
        if not rows:
            continue
        if not header_written:
            # 写入表头
            merged_ws.append(rows[0])
            header_written = True
        # 写入数据行(跳过表头)
        for row in rows[1:]:
            merged_ws.append(row)
    merged_wb.save(output_file)
    print(f"合并完成,保存至 {output_file}")

if __name__ == "__main__":
    merge_excel_files("./excel_reports", "merged.xlsx")

案例2:Excel数据筛选与格式化

"""
excel_filter_format.py
筛选出成绩大于90的学生,并标记为红色
"""

from openpyxl import load_workbook
from openpyxl.styles import Font

wb = load_workbook('scores.xlsx')
ws = wb.active

# 假设A列姓名,B列分数
for row in range(2, ws.max_row + 1):
    score_cell = ws.cell(row, 2)
    if score_cell.value and score_cell.value > 90:
        # 将分数单元格标记为红色加粗
        score_cell.font = Font(color='FF0000', bold=True)
        # 也可整行标记
        ws.row_dimensions[row].fill = PatternFill(start_color='FFFF00', fill_type='solid')

wb.save('scores_filtered.xlsx')

案例3:Word批量生成合同(模板替换)

"""
contract_generator.py
使用Word模板批量生成合同,并分页保存
"""

from docx import Document
import os

def generate_contracts(template_file, data_list, output_dir):
    """根据模板生成多份合同"""
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)
    
    for data in data_list:
        doc = Document(template_file)
        # 遍历所有段落
        for para in doc.paragraphs:
            for key, value in data.items():
                if key in para.text:
                    para.text = para.text.replace(key, str(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, str(value))
        # 保存
        output_file = os.path.join(output_dir, f"合同_{data['{name}']}.docx")
        doc.save(output_file)
        print(f"已生成: {output_file}")

# 示例数据
data_list = [
    {"{name}": "张三", "{amount}": "10000", "{date}": "2025-05-01"},
    {"{name}": "李四", "{amount}": "15000", "{date}": "2025-05-02"},
]
generate_contracts("contract_template.docx", data_list, "./contracts")

案例4:Word批量生成成绩单(表格填充)

"""
report_card.py
根据Excel中的成绩数据,批量生成Word成绩单
"""

import openpyxl
from docx import Document
from docx.shared import Inches

def create_report_card(student_name, scores, output_file):
    """生成单个学生成绩单"""
    doc = Document()
    doc.add_heading(f"{student_name} 成绩单", level=1)
    doc.add_paragraph(f"生成日期: 2025年5月")
    # 添加成绩表格
    table = doc.add_table(rows=1, cols=3)
    table.style = 'Light List Accent 1'
    hdr_cells = table.rows[0].cells
    hdr_cells[0].text = '科目'
    hdr_cells[1].text = '分数'
    hdr_cells[2].text = '等级'
    for subject, score in scores.items():
        row_cells = table.add_row().cells
        row_cells[0].text = subject
        row_cells[1].text = str(score)
        grade = '优秀' if score >= 90 else '良好' if score >= 75 else '及格' if score >= 60 else '不及格'
        row_cells[2].text = grade
    doc.save(output_file)

def batch_from_excel(excel_file, output_dir):
    wb = openpyxl.load_workbook(excel_file)
    ws = wb.active
    # 假设第一行是表头:姓名, 数学, 语文, 英语
    for row in ws.iter_rows(min_row=2, values_only=True):
        name, math, chinese, english = row[0], row[1], row[2], row[3]
        scores = {"数学": math, "语文": chinese, "英语": english}
        output_file = f"{output_dir}/{name}_成绩单.docx"
        create_report_card(name, scores, output_file)
        print(f"生成 {output_file}")

batch_from_excel("grades.xlsx", "./report_cards")

案例5:PPT批量生成汇报材料

"""
ppt_generator.py
根据数据文件批量生成PPT
"""

from pptx import Presentation
from pptx.util import Inches

def create_slide_with_text(prs, title, content):
    """添加内容幻灯片"""
    slide_layout = prs.slide_layouts[1]  # 标题和内容
    slide = prs.slides.add_slide(slide_layout)
    slide.shapes.title.text = title
    content_placeholder = slide.placeholders[1]
    content_placeholder.text = content

def create_slide_with_table(prs, title, headers, rows):
    """添加表格幻灯片"""
    slide = prs.slides.add_slide(prs.slide_layouts[5])  # 仅标题
    slide.shapes.title.text = title
    # 添加表格
    left = Inches(1); top = Inches(2); width = Inches(8); height = Inches(3)
    table = slide.shapes.add_table(len(rows)+1, len(headers), left, top, width, height).table
    # 表头
    for i, header in enumerate(headers):
        table.cell(0, i).text = header
    # 数据
    for row_idx, row in enumerate(rows, start=1):
        for col_idx, value in enumerate(row):
            table.cell(row_idx, col_idx).text = str(value)

def generate_report():
    prs = Presentation()
    # 标题页
    title_slide = prs.slides.add_slide(prs.slide_layouts[0])
    title_slide.shapes.title.text = "季度销售报告"
    title_slide.placeholders[1].text = "Python自动化生成"
    # 内容页
    create_slide_with_text(prs, "销售概况", "• 总销售额: 120万元\n• 同比增长: 15%\n• 完成率: 110%")
    # 表格页
    headers = ["产品", "销量", "销售额(万)"]
    data = [("A产品", 1200, 48), ("B产品", 800, 32), ("C产品", 600, 40)]
    create_slide_with_table(prs, "产品销售明细", headers, data)
    prs.save("sales_report.pptx")
    print("PPT生成完成")

generate_report()

案例6:从Excel生成PPT图表

"""
excel_to_ppt_chart.py
读取Excel数据,在PPT中插入图表
"""

import openpyxl
from pptx import Presentation
from pptx.chart.data import CategoryChartData
from pptx.enum.chart import XL_CHART_TYPE
from pptx.util import Inches
from pptx.dml.color import RGBColor

def excel_to_ppt_chart(excel_file, ppt_file, sheet_name):
    wb = openpyxl.load_workbook(excel_file)
    ws = wb[sheet_name]
    # 读取数据:第一列为类别,第二列为数值
    categories = []
    values = []
    for row in ws.iter_rows(min_row=2, values_only=True):
        if row[0] and row[1] is not None:
            categories.append(row[0])
            values.append(row[1])
    
    # 创建PPT
    prs = Presentation()
    slide = prs.slides.add_slide(prs.slide_layouts[5])  # 仅标题
    slide.shapes.title.text = f"{sheet_name} 销售柱状图"
    
    # 定义图表数据
    chart_data = CategoryChartData()
    chart_data.categories = categories
    chart_data.add_series('销售额', values)
    
    # 添加图表
    x, y, cx, cy = Inches(1), Inches(2), Inches(8), Inches(4.5)
    chart = slide.shapes.add_chart(
        XL_CHART_TYPE.COLUMN_CLUSTERED, x, y, cx, cy, chart_data
    ).chart
    chart.has_legend = True
    prs.save(ppt_file)
    print(f"图表已保存至 {ppt_file}")

excel_to_ppt_chart("sales_data.xlsx", "chart_report.pptx", "季度销售")

案例7:批量修改Word文档中的表格内容

"""
batch_modify_word_tables.py
批量修改Word文档中表格的指定单元格
"""

import os
from docx import Document

def update_table_cell(doc_path, row, col, new_value):
    doc = Document(doc_path)
    for table in doc.tables:
        # 假设修改第一个表格
        if row < len(table.rows) and col < len(table.rows[row].cells):
            table.cell(row, col).text = str(new_value)
    doc.save(doc_path)

def batch_update(folder_path, target_cell):
    for filename in os.listdir(folder_path):
        if filename.endswith('.docx'):
            filepath = os.path.join(folder_path, filename)
            # 例如替换第2行第3列
            update_table_cell(filepath, 1, 2, target_cell)
            print(f"更新: {filename}")

batch_update("./docs", "新内容")

案例8:综合实战——生成员工工资条(Excel+Word)

"""
salary_slip.py
从Excel读取员工信息,批量生成Word工资条
"""

import openpyxl
from docx import Document
from docx.shared import Inches

def generate_salary_slip(excel_file, output_dir):
    wb = openpyxl.load_workbook(excel_file)
    ws = wb.active
    headers = [cell.value for cell in ws[1]]  # 表头
    for row in ws.iter_rows(min_row=2, values_only=True):
        doc = Document()
        doc.add_heading("××公司工资条", level=1)
        doc.add_paragraph(f"员工: {row[0]}")
        doc.add_paragraph(f"部门: {row[1]}")
        doc.add_paragraph(f"基本工资: {row[2]}")
        doc.add_paragraph(f"奖金: {row[3]}")
        doc.add_paragraph(f"扣除: {row[4]}")
        doc.add_paragraph(f"实发: {row[5]}")
        # 可以添加表格形式
        table = doc.add_table(rows=len(headers), cols=2)
        for i, header in enumerate(headers):
            table.cell(i, 0).text = header
            table.cell(i, 1).text = str(row[i])
        output_path = f"{output_dir}/工资条_{row[0]}.docx"
        doc.save(output_path)
        print(f"生成: {output_path}")

generate_salary_slip("employees.xlsx", "./salary_slips")

⚠️ 易错点避坑总结

序号坑点描述后果解决方案
1openpyxl读取时未指定data_only=True读取公式单元格得到公式字符串而非计算结果load_workbook('file.xlsx', data_only=True)
2修改文档后忘记保存更改未生效调用doc.save()wb.save()
3Word中替换文本时未遍历表格表格中的占位符未被替换同时遍历doc.tables
4PPT中添加图表时数据格式错误图表不显示确保CategoryChartData使用正确的数据结构
5操作大Excel文件时内存占用高程序变慢或崩溃使用read_only=True模式读取,write_only=True写入
6python-docx不支持.docx旧版本报错确保文件是Office 2007+格式
7插入图片时未设置尺寸图片可能过大使用Inches()Cm()指定宽高
8合并单元格后写入内容位置错误内容可能空白合并后向合并区域左上角单元格写入即可
9批量操作时未处理文件不存在异常程序崩溃使用os.path.exists()检查
10修改后原格式丢失Word/Excel样式被覆盖先复制模版再修改,或使用样式库

📝 课后实战练习题

第1题:Excel数据统计与报表生成

给定一个Excel文件,包含学生的学习成绩(姓名、语文、数学、英语)。要求:

  • 计算每个学生的总分和平均分,写入新增列。
  • 标记总分前3名为“优秀”,添加批注。
  • 生成一个柱状图展示每门科目的平均分。

第2题:Word批量生成录取通知书

从Excel中读取学生姓名、专业、报到日期,使用Word模板(包含{name}{major}{date}占位符)批量生成通知书,并将每个通知书单独保存。

第3题:PPT从Excel批量创建幻灯片

有一个Excel文件包含多个工作表,每个工作表代表一个部门的销售数据(第一行表头,第二行开始数据)。要求为每个工作表生成一张幻灯片,幻灯片标题为部门名,内容为数据表格,并附上柱状图。

第4题:合并多个Word文档

编写脚本,将某个文件夹下的所有Word文档按文件名顺序合并成一个新的Word文档(每个文档之间加分页符)。

第5题:Excel文件拆分

有一个包含多个部门的工资总表,按部门拆分成多个Excel文件,每个文件以部门名称命名。

第6题:Word表格内容填充与样式设置

创建一个Word文档,包含一个4x4的表格,用Python填充数据(如九九乘法表),并将表格样式设置为“网格”,表头加粗居中。

第7题:自动化汇报材料生成(综合)

给定一个包含项目进度数据的Excel文件(项目名称、计划完成日期、实际完成日期、完成百分比),自动生成一份PPT汇报材料:标题幻灯片、项目概览文字幻灯片、每个项目的进度条幻灯片(可使用图表)。


🧠 知识点思维导图总结

第40课:办公自动化

Excel处理 openpyxl

工作簿: load_workbook, Workbook

工作表: active, title

单元格: cell, value

样式: Font, PatternFill, Alignment

图表: BarChart, Reference

公式: 直接写入字符串

合并单元格: merge_cells

Word处理 python-docx

文档: Document

段落: add_paragraph, run样式

表格: add_table, cell访问

图片: add_picture

页眉页脚: sections

占位符替换: 遍历段落和表格

PPT处理 python-pptx

演示文稿: Presentation

幻灯片布局: slide_layouts索引

添加幻灯片: add_slide

形状: title, placeholders

图表: CategoryChartData, add_chart

图片: add_picture

批量处理技巧

遍历文件夹: os.listdir

模板模式: 占位符替换

异常处理: try-except

面试考点

openpyxl vs xlrd/xlwt

批量生成文档思路

python-docx模板使用

PPT图表动态生成


🔜 下节课预告

办公自动化让我们能够高效处理文档。下一节课我们将进入数据分析入门,学习NumPy库,它是科学计算和数据处理的基石。

第41课:数据分析入门:Numpy数组运算与底层原理精讲

内容包括:

  • NumPy数组创建和属性
  • 数组运算(向量化)
  • 索引、切片、布尔索引
  • 广播机制
  • 通用函数(ufunc)
  • 实战:数学计算、图像数组处理

NumPy是Python数据科学生态的基石,学好它将为后面的Pandas和机器学习打下坚实基础。

🌟 学习鼓励:办公自动化是Python最容易产生实际价值的领域之一。通过本课的学习,你已经能够用代码代替重复的手工劳动。建议你从自己日常工作中找一个小任务(比如合并Excel、生成Word流水号等)开始实践,你会发现编程带来的效率提升令人兴奋。下一阶段我们将进入数据分析世界,同样精彩!


🔗《50节课 Python 从入门到精通》系列课程导航

去订阅

🌟 感谢您耐心阅读到这里!
💡 如果本文对您有所启发欢迎:
👍 点赞📌 收藏 📤 分享给更多需要的伙伴。
🗣️ 期待在评论区看到您的想法, 共同进步。
🔔 关注我,持续获取更多干货内容~
🤗 我们下篇文章见~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Thomas.Sir

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值