欢迎光临
我们一直在努力

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

在这里插入图片描述

文章目录

  • 📖 开篇导读
  • 🎯 学习目标
  • 📚 知识点理论精讲
    • 一、`openpyxl` —— Excel自动化处理
      • 1.1 安装
      • 1.2 核心概念
      • 1.3 读取Excel文件
      • 1.4 写入Excel文件
      • 1.5 样式设置
      • 1.6 公式
      • 1.7 图表
      • 1.8 合并/拆分单元格
    • 二、`python-docx` —— Word文档处理
      • 2.1 安装
      • 2.2 核心概念
      • 2.3 创建与保存
      • 2.4 添加不同格式的文本
      • 2.5 添加表格
      • 2.6 添加图片
      • 2.7 分页
      • 2.8 读取现有文档
    • 三、`python-pptx` —— PPT自动化
      • 3.1 安装
      • 3.2 创建与保存
      • 3.3 常用幻灯片布局索引
      • 3.4 添加内容
      • 3.5 添加图片
      • 3.6 添加表格
      • 3.7 修改现有PPT
  • 💻 代码案例实操
    • 案例1:Excel批量处理——合并多个工作簿
    • 案例2:Excel数据筛选与格式化
    • 案例3:Word批量生成合同(模板替换)
    • 案例4:Word批量生成成绩单(表格填充)
    • 案例5:PPT批量生成汇报材料
    • 案例6:从Excel生成PPT图表
    • 案例7:批量修改Word文档中的表格内容
    • 案例8:综合实战——生成员工工资条(Excel+Word)
  • ⚠️ 易错点避坑总结
  • 📝 课后实战练习题
      • 第1题:Excel数据统计与报表生成
      • 第2题:Word批量生成录取通知书
      • 第3题:PPT从Excel批量创建幻灯片
      • 第4题:合并多个Word文档
      • 第5题:Excel文件拆分
      • 第6题:Word表格内容填充与样式设置
      • 第7题:自动化汇报材料生成(综合)
  • 🧠 知识点思维导图总结
  • 🔜 下节课预告
    • 第41课:数据分析入门:Numpy数组运算与底层原理精讲
  • 🔗《50节课 Python 从入门到精通》系列课程导航

📖 开篇导读

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

💡 工作场景:

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

本课将学习三个核心库:

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

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


🎯 学习目标

目标编号具体掌握内容对应面试/工作价值
1️⃣ 安装openpyxl、python-docx、python-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")


⚠️ 易错点避坑总结

序号坑点描述后果解决方案
1 openpyxl读取时未指定data_only=True 读取公式单元格得到公式字符串而非计算结果 load_workbook('file.xlsx', data_only=True)
2 修改文档后忘记保存 更改未生效 调用doc.save()或wb.save()
3 Word中替换文本时未遍历表格 表格中的占位符未被替换 同时遍历doc.tables
4 PPT中添加图表时数据格式错误 图表不显示 确保CategoryChartData使用正确的数据结构
5 操作大Excel文件时内存占用高 程序变慢或崩溃 使用read_only=True模式读取,write_only=True写入
6 python-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文档,包含一个4×4的表格,用Python填充数据(如九九乘法表),并将表格样式设置为“网格”,表头加粗居中。

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

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


🧠 知识点思维导图总结

#mermaid-svg-MWWoHJtFPy9Sv0QH{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-MWWoHJtFPy9Sv0QH .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-MWWoHJtFPy9Sv0QH .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-MWWoHJtFPy9Sv0QH .error-icon{fill:#552222;}#mermaid-svg-MWWoHJtFPy9Sv0QH .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-MWWoHJtFPy9Sv0QH .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-MWWoHJtFPy9Sv0QH .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-MWWoHJtFPy9Sv0QH .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-MWWoHJtFPy9Sv0QH .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-MWWoHJtFPy9Sv0QH .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-MWWoHJtFPy9Sv0QH .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-MWWoHJtFPy9Sv0QH .marker{fill:#333333;stroke:#333333;}#mermaid-svg-MWWoHJtFPy9Sv0QH .marker.cross{stroke:#333333;}#mermaid-svg-MWWoHJtFPy9Sv0QH svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-MWWoHJtFPy9Sv0QH p{margin:0;}#mermaid-svg-MWWoHJtFPy9Sv0QH .edge{stroke-width:3;}#mermaid-svg-MWWoHJtFPy9Sv0QH .section–1 rect,#mermaid-svg-MWWoHJtFPy9Sv0QH .section–1 path,#mermaid-svg-MWWoHJtFPy9Sv0QH .section–1 circle,#mermaid-svg-MWWoHJtFPy9Sv0QH .section–1 polygon,#mermaid-svg-MWWoHJtFPy9Sv0QH .section–1 path{fill:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-MWWoHJtFPy9Sv0QH .section–1 text{fill:#ffffff;}#mermaid-svg-MWWoHJtFPy9Sv0QH .node-icon–1{font-size:40px;color:#ffffff;}#mermaid-svg-MWWoHJtFPy9Sv0QH .section-edge–1{stroke:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-MWWoHJtFPy9Sv0QH .edge-depth–1{stroke-width:17;}#mermaid-svg-MWWoHJtFPy9Sv0QH .section–1 line{stroke:hsl(60, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-MWWoHJtFPy9Sv0QH .disabled,#mermaid-svg-MWWoHJtFPy9Sv0QH .disabled circle,#mermaid-svg-MWWoHJtFPy9Sv0QH .disabled text{fill:lightgray;}#mermaid-svg-MWWoHJtFPy9Sv0QH .disabled text{fill:#efefef;}#mermaid-svg-MWWoHJtFPy9Sv0QH .section-0 rect,#mermaid-svg-MWWoHJtFPy9Sv0QH .section-0 path,#mermaid-svg-MWWoHJtFPy9Sv0QH .section-0 circle,#mermaid-svg-MWWoHJtFPy9Sv0QH .section-0 polygon,#mermaid-svg-MWWoHJtFPy9Sv0QH .section-0 path{fill:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-MWWoHJtFPy9Sv0QH .section-0 text{fill:black;}#mermaid-svg-MWWoHJtFPy9Sv0QH .node-icon-0{font-size:40px;color:black;}#mermaid-svg-MWWoHJtFPy9Sv0QH .section-edge-0{stroke:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-MWWoHJtFPy9Sv0QH .edge-depth-0{stroke-width:14;}#mermaid-svg-MWWoHJtFPy9Sv0QH .section-0 line{stroke:hsl(240, 100%, 83.5294117647%);stroke-width:3;}#mermaid-svg-MWWoHJtFPy9Sv0QH .disabled,#mermaid-svg-MWWoHJtFPy9Sv0QH .disabled circle,#mermaid-svg-MWWoHJtFPy9Sv0QH .disabled text{fill:lightgray;}#mermaid-svg-MWWoHJtFPy9Sv0QH .disabled text{fill:#efefef;}#mermaid-svg-MWWoHJtFPy9Sv0QH .section-1 rect,#mermaid-svg-MWWoHJtFPy9Sv0QH .section-1 path,#mermaid-svg-MWWoHJtFPy9Sv0QH .section-1 circle,#mermaid-svg-MWWoHJtFPy9Sv0QH .section-1 polygon,#mermaid-svg-MWWoHJtFPy9Sv0QH .section-1 path{fill:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-MWWoHJtFPy9Sv0QH .section-1 text{fill:black;}#mermaid-svg-MWWoHJtFPy9Sv0QH .node-icon-1{font-size:40px;color:black;}#mermaid-svg-MWWoHJtFPy9Sv0QH .section-edge-1{stroke:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-MWWoHJtFPy9Sv0QH .edge-depth-1{stroke-width:11;}#mermaid-svg-MWWoHJtFPy9Sv0QH .section-1 line{stroke:hsl(260, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-MWWoHJtFPy9Sv0QH .disabled,#mermaid-svg-MWWoHJtFPy9Sv0QH .disabled circle,#mermaid-svg-MWWoHJtFPy9Sv0QH .disabled text{fill:lightgray;}#mermaid-svg-MWWoHJtFPy9Sv0QH .disabled text{fill:#efefef;}#mermaid-svg-MWWoHJtFPy9Sv0QH .section-2 rect,#mermaid-svg-MWWoHJtFPy9Sv0QH .section-2 path,#mermaid-svg-MWWoHJtFPy9Sv0QH .section-2 circle,#mermaid-svg-MWWoHJtFPy9Sv0QH .section-2 polygon,#mermaid-svg-MWWoHJtFPy9Sv0QH .section-2 path{fill:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-MWWoHJtFPy9Sv0QH .section-2 text{fill:#ffffff;}#mermaid-svg-MWWoHJtFPy9Sv0QH .node-icon-2{font-size:40px;color:#ffffff;}#mermaid-svg-MWWoHJtFPy9Sv0QH .section-edge-2{stroke:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-MWWoHJtFPy9Sv0QH .edge-depth-2{stroke-width:8;}#mermaid-svg-MWWoHJtFPy9Sv0QH .section-2 line{stroke:hsl(90, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-MWWoHJtFPy9Sv0QH .disabled,#mermaid-svg-MWWoHJtFPy9Sv0QH .disabled circle,#mermaid-svg-MWWoHJtFPy9Sv0QH .disabled text{fill:lightgray;}#mermaid-svg-MWWoHJtFPy9Sv0QH .disabled text{fill:#efefef;}#mermaid-svg-MWWoHJtFPy9Sv0QH .section-3 rect,#mermaid-svg-MWWoHJtFPy9Sv0QH .section-3 path,#mermaid-svg-MWWoHJtFPy9Sv0QH .section-3 circle,#mermaid-svg-MWWoHJtFPy9Sv0QH .section-3 polygon,#mermaid-svg-MWWoHJtFPy9Sv0QH .section-3 path{fill:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-MWWoHJtFPy9Sv0QH .section-3 text{fill:black;}#mermaid-svg-MWWoHJtFPy9Sv0QH .node-icon-3{font-size:40px;color:black;}#mermaid-svg-MWWoHJtFPy9Sv0QH .section-edge-3{stroke:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-MWWoHJtFPy9Sv0QH .edge-depth-3{stroke-width:5;}#mermaid-svg-MWWoHJtFPy9Sv0QH .section-3 line{stroke:hsl(120, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-MWWoHJtFPy9Sv0QH .disabled,#mermaid-svg-MWWoHJtFPy9Sv0QH .disabled circle,#mermaid-svg-MWWoHJtFPy9Sv0QH .disabled text{fill:lightgray;}#mermaid-svg-MWWoHJtFPy9Sv0QH .disabled text{fill:#efefef;}#mermaid-svg-MWWoHJtFPy9Sv0QH .section-4 rect,#mermaid-svg-MWWoHJtFPy9Sv0QH .section-4 path,#mermaid-svg-MWWoHJtFPy9Sv0QH .section-4 circle,#mermaid-svg-MWWoHJtFPy9Sv0QH .section-4 polygon,#mermaid-svg-MWWoHJtFPy9Sv0QH .section-4 path{fill:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-MWWoHJtFPy9Sv0QH .section-4 text{fill:black;}#mermaid-svg-MWWoHJtFPy9Sv0QH .node-icon-4{font-size:40px;color:black;}#mermaid-svg-MWWoHJtFPy9Sv0QH .section-edge-4{stroke:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-MWWoHJtFPy9Sv0QH .edge-depth-4{stroke-width:2;}#mermaid-svg-MWWoHJtFPy9Sv0QH .section-4 line{stroke:hsl(150, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-MWWoHJtFPy9Sv0QH .disabled,#mermaid-svg-MWWoHJtFPy9Sv0QH .disabled circle,#mermaid-svg-MWWoHJtFPy9Sv0QH .disabled text{fill:lightgray;}#mermaid-svg-MWWoHJtFPy9Sv0QH .disabled text{fill:#efefef;}#mermaid-svg-MWWoHJtFPy9Sv0QH .section-5 rect,#mermaid-svg-MWWoHJtFPy9Sv0QH .section-5 path,#mermaid-svg-MWWoHJtFPy9Sv0QH .section-5 circle,#mermaid-svg-MWWoHJtFPy9Sv0QH .section-5 polygon,#mermaid-svg-MWWoHJtFPy9Sv0QH .section-5 path{fill:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-MWWoHJtFPy9Sv0QH .section-5 text{fill:black;}#mermaid-svg-MWWoHJtFPy9Sv0QH .node-icon-5{font-size:40px;color:black;}#mermaid-svg-MWWoHJtFPy9Sv0QH .section-edge-5{stroke:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-MWWoHJtFPy9Sv0QH .edge-depth-5{stroke-width:-1;}#mermaid-svg-MWWoHJtFPy9Sv0QH .section-5 line{stroke:hsl(180, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-MWWoHJtFPy9Sv0QH .disabled,#mermaid-svg-MWWoHJtFPy9Sv0QH .disabled circle,#mermaid-svg-MWWoHJtFPy9Sv0QH .disabled text{fill:lightgray;}#mermaid-svg-MWWoHJtFPy9Sv0QH .disabled text{fill:#efefef;}#mermaid-svg-MWWoHJtFPy9Sv0QH .section-6 rect,#mermaid-svg-MWWoHJtFPy9Sv0QH .section-6 path,#mermaid-svg-MWWoHJtFPy9Sv0QH .section-6 circle,#mermaid-svg-MWWoHJtFPy9Sv0QH .section-6 polygon,#mermaid-svg-MWWoHJtFPy9Sv0QH .section-6 path{fill:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-MWWoHJtFPy9Sv0QH .section-6 text{fill:black;}#mermaid-svg-MWWoHJtFPy9Sv0QH .node-icon-6{font-size:40px;color:black;}#mermaid-svg-MWWoHJtFPy9Sv0QH .section-edge-6{stroke:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-MWWoHJtFPy9Sv0QH .edge-depth-6{stroke-width:-4;}#mermaid-svg-MWWoHJtFPy9Sv0QH .section-6 line{stroke:hsl(210, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-MWWoHJtFPy9Sv0QH .disabled,#mermaid-svg-MWWoHJtFPy9Sv0QH .disabled circle,#mermaid-svg-MWWoHJtFPy9Sv0QH .disabled text{fill:lightgray;}#mermaid-svg-MWWoHJtFPy9Sv0QH .disabled text{fill:#efefef;}#mermaid-svg-MWWoHJtFPy9Sv0QH .section-7 rect,#mermaid-svg-MWWoHJtFPy9Sv0QH .section-7 path,#mermaid-svg-MWWoHJtFPy9Sv0QH .section-7 circle,#mermaid-svg-MWWoHJtFPy9Sv0QH .section-7 polygon,#mermaid-svg-MWWoHJtFPy9Sv0QH .section-7 path{fill:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-MWWoHJtFPy9Sv0QH .section-7 text{fill:black;}#mermaid-svg-MWWoHJtFPy9Sv0QH .node-icon-7{font-size:40px;color:black;}#mermaid-svg-MWWoHJtFPy9Sv0QH .section-edge-7{stroke:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-MWWoHJtFPy9Sv0QH .edge-depth-7{stroke-width:-7;}#mermaid-svg-MWWoHJtFPy9Sv0QH .section-7 line{stroke:hsl(270, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-MWWoHJtFPy9Sv0QH .disabled,#mermaid-svg-MWWoHJtFPy9Sv0QH .disabled circle,#mermaid-svg-MWWoHJtFPy9Sv0QH .disabled text{fill:lightgray;}#mermaid-svg-MWWoHJtFPy9Sv0QH .disabled text{fill:#efefef;}#mermaid-svg-MWWoHJtFPy9Sv0QH .section-8 rect,#mermaid-svg-MWWoHJtFPy9Sv0QH .section-8 path,#mermaid-svg-MWWoHJtFPy9Sv0QH .section-8 circle,#mermaid-svg-MWWoHJtFPy9Sv0QH .section-8 polygon,#mermaid-svg-MWWoHJtFPy9Sv0QH .section-8 path{fill:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-MWWoHJtFPy9Sv0QH .section-8 text{fill:black;}#mermaid-svg-MWWoHJtFPy9Sv0QH .node-icon-8{font-size:40px;color:black;}#mermaid-svg-MWWoHJtFPy9Sv0QH .section-edge-8{stroke:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-MWWoHJtFPy9Sv0QH .edge-depth-8{stroke-width:-10;}#mermaid-svg-MWWoHJtFPy9Sv0QH .section-8 line{stroke:hsl(330, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-MWWoHJtFPy9Sv0QH .disabled,#mermaid-svg-MWWoHJtFPy9Sv0QH .disabled circle,#mermaid-svg-MWWoHJtFPy9Sv0QH .disabled text{fill:lightgray;}#mermaid-svg-MWWoHJtFPy9Sv0QH .disabled text{fill:#efefef;}#mermaid-svg-MWWoHJtFPy9Sv0QH .section-9 rect,#mermaid-svg-MWWoHJtFPy9Sv0QH .section-9 path,#mermaid-svg-MWWoHJtFPy9Sv0QH .section-9 circle,#mermaid-svg-MWWoHJtFPy9Sv0QH .section-9 polygon,#mermaid-svg-MWWoHJtFPy9Sv0QH .section-9 path{fill:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-MWWoHJtFPy9Sv0QH .section-9 text{fill:black;}#mermaid-svg-MWWoHJtFPy9Sv0QH .node-icon-9{font-size:40px;color:black;}#mermaid-svg-MWWoHJtFPy9Sv0QH .section-edge-9{stroke:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-MWWoHJtFPy9Sv0QH .edge-depth-9{stroke-width:-13;}#mermaid-svg-MWWoHJtFPy9Sv0QH .section-9 line{stroke:hsl(0, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-MWWoHJtFPy9Sv0QH .disabled,#mermaid-svg-MWWoHJtFPy9Sv0QH .disabled circle,#mermaid-svg-MWWoHJtFPy9Sv0QH .disabled text{fill:lightgray;}#mermaid-svg-MWWoHJtFPy9Sv0QH .disabled text{fill:#efefef;}#mermaid-svg-MWWoHJtFPy9Sv0QH .section-10 rect,#mermaid-svg-MWWoHJtFPy9Sv0QH .section-10 path,#mermaid-svg-MWWoHJtFPy9Sv0QH .section-10 circle,#mermaid-svg-MWWoHJtFPy9Sv0QH .section-10 polygon,#mermaid-svg-MWWoHJtFPy9Sv0QH .section-10 path{fill:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-MWWoHJtFPy9Sv0QH .section-10 text{fill:black;}#mermaid-svg-MWWoHJtFPy9Sv0QH .node-icon-10{font-size:40px;color:black;}#mermaid-svg-MWWoHJtFPy9Sv0QH .section-edge-10{stroke:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-MWWoHJtFPy9Sv0QH .edge-depth-10{stroke-width:-16;}#mermaid-svg-MWWoHJtFPy9Sv0QH .section-10 line{stroke:hsl(30, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-MWWoHJtFPy9Sv0QH .disabled,#mermaid-svg-MWWoHJtFPy9Sv0QH .disabled circle,#mermaid-svg-MWWoHJtFPy9Sv0QH .disabled text{fill:lightgray;}#mermaid-svg-MWWoHJtFPy9Sv0QH .disabled text{fill:#efefef;}#mermaid-svg-MWWoHJtFPy9Sv0QH .section-root rect,#mermaid-svg-MWWoHJtFPy9Sv0QH .section-root path,#mermaid-svg-MWWoHJtFPy9Sv0QH .section-root circle,#mermaid-svg-MWWoHJtFPy9Sv0QH .section-root polygon{fill:hsl(240, 100%, 46.2745098039%);}#mermaid-svg-MWWoHJtFPy9Sv0QH .section-root text{fill:#ffffff;}#mermaid-svg-MWWoHJtFPy9Sv0QH .section-root span{color:#ffffff;}#mermaid-svg-MWWoHJtFPy9Sv0QH .section-2 span{color:#ffffff;}#mermaid-svg-MWWoHJtFPy9Sv0QH .icon-container{height:100%;display:flex;justify-content:center;align-items:center;}#mermaid-svg-MWWoHJtFPy9Sv0QH .edge{fill:none;}#mermaid-svg-MWWoHJtFPy9Sv0QH .mindmap-node-label{dy:1em;alignment-baseline:middle;text-anchor:middle;dominant-baseline:middle;text-align:center;}#mermaid-svg-MWWoHJtFPy9Sv0QH :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

第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 从入门到精通》系列课程导航

去订阅

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

赞(0)
未经允许不得转载:171主机测评 » 第40课:Python|办公自动化【Excel/Word/PPT批量处理零基础实战】
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址