4Automate the Boring Stuff with Python(第2版)

操作Excel

电子表格自动化

openpyxl公式图表数据提取

🎯 AI 时代的学习建议:不要只读理论。理解这一章的设计动机(为什么需要这个概念?)和边界条件(什么情况下会失效?)。当 AI 生成的代码涉及这些概念时,你能判断它是否用对了场景。AI 能帮你总结内容,但无法替代你亲手阅读、思考、建立直觉的过程。

第4章:操作Excel

一、导读

1.1 本章学习目标

第4章讲解如何用 Python 操作 Excel 文件:openpyxl 读写、公式、图表、数据提取。

本章核心学习目标:

  • 掌握 openpyxl:读写 Excel 文件
  • 理解工作簿、工作表、单元格的关系
  • 掌握公式和图表
  • 实现数据提取和报告生成

1.2 为什么本章如此重要

Excel 是办公自动化的核心。用 Python 操作 Excel 能自动化大量重复的数据处理工作。

1.3 核心问题引导

openpyxl 如何操作单元格?

如何在 Excel 中插入公式?

如何批量处理多个 Excel 文件?


二、核心概念详解

2.1 openpyxl 基础

python
from openpyxl import Workbook, load_workbook

# 创建新工作簿
wb = Workbook()
ws = wb.active
ws.title = "Sales Data"

# 写入数据
ws['A1'] = 'Product'
ws['B1'] = 'Quantity'
ws['C1'] = 'Price'

data = [
    ['Apple', 100, 1.5],
    ['Banana', 200, 0.8],
    ['Cherry', 50, 3.0],
]

for row in data:
    ws.append(row)

# 添加公式
ws['D1'] = 'Total'
for row in range(2, 5):
    ws[f'D{row}'] = f'=B{row}*C{row}'

ws['D5'] = '=SUM(D2:D4)'

# 保存
wb.save('sales.xlsx')

# 读取工作簿
wb = load_workbook('sales.xlsx')
ws = wb.active
print(ws['A1'].value)  # Product

2.2 样式和格式

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

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

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

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

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

# 列宽
ws.column_dimensions['A'].width = 20
ws.column_dimensions['B'].width = 15

2.3 图表

python
from openpyxl.chart import BarChart, Reference

# 创建柱状图
chart = BarChart()
chart.title = "Sales Report"
chart.x_axis.title = "Product"
chart.y_axis.title = "Revenue"

data = Reference(ws, min_col=4, min_row=1, max_row=4)
categories = Reference(ws, min_col=1, min_row=2, max_row=4)
chart.add_data(data, titles_from_data=True)
chart.set_categories(categories)

ws.add_chart(chart, "F2")

三、实战案例

3.1 案例一:自动生成销售报告

python
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill
from datetime import datetime

def generate_sales_report(sales_data, output_file):
    wb = Workbook()
    ws = wb.active
    ws.title = "Monthly Report"
    
    # 标题
    ws.merge_cells('A1:D1')
    ws['A1'] = f'Sales Report - {datetime.now().strftime("%B %Y")}'
    ws['A1'].font = Font(bold=True, size=16)
    
    # 表头
    headers = ['Product', 'Units', 'Unit Price', 'Revenue']
    for col, header in enumerate(headers, 1):
        cell = ws.cell(row=3, column=col, value=header)
        cell.font = Font(bold=True)
        cell.fill = PatternFill(start_color='4472C4', fill_type='solid')
        cell.font = Font(bold=True, color='FFFFFF')
    
    # 数据
    for row_idx, item in enumerate(sales_data, 4):
        ws.cell(row=row_idx, column=1, value=item['product'])
        ws.cell(row=row_idx, column=2, value=item['units'])
        ws.cell(row=row_idx, column=3, value=item['price'])
        ws.cell(row=row_idx, column=4).value = f'=B{row_idx}*C{row_idx}'
    
    # 总计
    total_row = len(sales_data) + 4
    ws.cell(row=total_row, column=1, value='Total').font = Font(bold=True)
    ws.cell(row=total_row, column=4).value = f'=SUM(D4:D{total_row-1})'
    
    wb.save(output_file)
    print(f"Report saved to {output_file}")

# 使用
sales = [
    {'product': 'Widget A', 'units': 150, 'price': 29.99},
    {'product': 'Widget B', 'units': 200, 'price': 19.99},
    {'product': 'Widget C', 'units': 75, 'price': 49.99},
]
generate_sales_report(sales, 'report.xlsx')

四、本章小结

openpyxl 读写 Excel 文件

样式让报告更专业

公式和图表实现自动计算和可视化


五、思考与练习

如何合并多个 Excel 文件的数据?

如何处理 Excel 中的日期格式?


4/7操作Ex
0%