Python Excel案例:如何用Python高效操作Excel表格(完整实战指南)
📚 目录导读
- 为什么选择Python操作Excel?
- 环境准备与库安装
- 读取Excel数据(经典案例)
- 写入与更新Excel表格
- 样式设置与格式处理
- 实战案例:自动化报表生成
- 常见问题问答(Q&A)
- 总结与扩展建议
为什么选择Python操作Excel?
在日常办公中,Excel是最常用的数据处理工具,当面对大量重复性操作(如数据清洗、批量合并、定期报表生成)时,手动操作效率低下且易出错,Python凭借其强大的第三方库(如openpyxl、pandas、xlrd/xlwt),能够实现:

- 自动化处理:秒级完成千行数据的读取、筛选、计算。
- 跨平台兼容:在Windows、macOS、Linux上均可运行。
- 与数据库联动:轻松将Excel数据导入/导出至SQL、CSV等格式。
核心库对比:
openpyxl支持.xlsx格式的读写与样式(推荐企业使用);pandas擅长数据分析与表格整合;xlrd/xlwt适合旧版.xls文件(已逐步淘汰)。
环境准备与库安装
1 安装必要库
打开终端或命令行,执行以下命令(建议使用Python 3.7+):
pip install openpyxl pandas xlsxwriter
openpyxl:读写.xlsx文件,支持样式、图表。pandas:高效数据处理,配合openpyxl写入Excel。xlsxwriter:高级功能(如条件格式、图表)。
2 数据结构理解
Python操作Excel的核心是 工作簿(Workbook)→ 工作表(Worksheet)→ 单元格(Cell) 的层级关系。
读取Excel数据(经典案例)
1 基础读取(openpyxl方式)
假设有一个销售数据.xlsx文件,包含“日期”、“产品”、“销售额”三列,代码如下:
import openpyxl
# 加载工作簿
wb = openpyxl.load_workbook('销售数据.xlsx')
# 获取活动工作表(或指定名称:wb['Sheet1'])
ws = wb.active
# 读取整表数据
for row in ws.iter_rows(min_row=1, values_only=True):
print(row) # 输出每行元组
2 读取特定区域(pandas方式)
pandas的read_excel函数更直观:
import pandas as pd
df = pd.read_excel('销售数据.xlsx', sheet_name='Sheet1', usecols='A:C')
print(df.head()) # 显示前5行
重点:当数据量超过10万行时,建议使用pandas的chunksize参数分块读取,避免内存溢出。
写入与更新Excel表格
1 新建并写入数据(openpyxl)
from openpyxl import Workbook
wb = Workbook()
ws = wb.active= "月度报表"
# 写入表头
headers = ['月份', '收入', '成本']
ws.append(headers)
# 写入多行数据
data = [['1月', 50000, 30000], ['2月', 55000, 32000]]
for row in data:
ws.append(row)
wb.save('报表_2024.xlsx')
2 更新已有文件(追加或修改)
# 打开已有文件
wb = openpyxl.load_workbook('报表_2024.xlsx')
ws = wb.active
# 修改指定单元格(B2单元格改为60000)
ws['B2'] = 60000
# 在末尾追加新行
ws.append(['3月', 62000, 35000])
wb.save('报表_2024.xlsx') # 覆盖保存
样式设置与格式处理
1 设置单元格格式(字体、背景、对齐)
from openpyxl.styles import Font, PatternFill, Alignment ws['A1'].font = Font(name='微软雅黑', size=12, bold=True, color='FFFFFF') ws['A1'].fill = PatternFill(start_color='4472C4', end_color='4472C4', fill_type='solid') ws['A1'].alignment = Alignment(horizontal='center', vertical='center')
2 自动调整列宽
# 遍历列,根据内容自适应宽度
for col in ws.columns:
max_length = 0
column_letter = col[0].column_letter
for cell in col:
if cell.value:
max_length = max(max_length, len(str(cell.value)))
ws.column_dimensions[column_letter].width = max_length + 2
实战案例:自动化报表生成
需求描述
每周需从原始数据订单明细.csv中,按“区域”汇总销售额,并输出格式化Excel报表。
代码实现(含注释)
import pandas as pd
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Alignment
# 1. 读取CSV数据
df = pd.read_csv('订单明细.csv')
# 2. 按区域分组汇总
summary = df.groupby('区域')['销售额'].sum().reset_index()
summary.columns = ['区域', '总销售额']
# 3. 创建Excel并写入
wb = Workbook()
ws = wb.active= "区域汇总"
# 写入表头
ws.append(['区域', '总销售额'])
header_fill = PatternFill(start_color='FFC000', end_color='FFC000', fill_type='solid')
header_font = Font(bold=True, size=11)
for cell in ws[1]:
cell.fill = header_fill
cell.font = header_font
cell.alignment = Alignment(horizontal='center')
# 写入数据
for _, row in summary.iterrows():
ws.append([row['区域'], row['总销售额']])
# 自动列宽
for col in ws.columns:
max_len = max(len(str(cell.value)) if cell.value else 0 for cell in col)
ws.column_dimensions[col[0].column_letter].width = max_len + 4
# 保存文件
wb.save('区域销售报表.xlsx')
print("报表生成成功!")
常见问题问答(Q&A)
Q1:为什么我读取的Excel数据带有多余的空行或None值?
A:可能是Excel末尾存在空白行,建议在iter_rows()时指定max_row,或使用pandas的dropna()方法过滤。
Q2:如何保存后保留Excel中原有的图表和格式?
A:推荐使用openpyxl打开原文件后追加写入(不新建),但注意openpyxl对部分旧版图表支持有限,若图表复杂,可考虑xlwings库直接调用Excel应用程序。
Q3:处理超大Excel文件(超1GB)时内存不足怎么办?
A:使用openpyxl的只读模式(read_only=True)或pandas的chunksize分块处理,避免一次性加载全部数据。
Q4:openpyxl与xlsxwriter哪个更适合写入?
A:xlsxwriter写入速度更快,且支持更复杂的功能(如数据验证、缩放比例),但无法读取已有文件。openpyxl读写均衡,日常使用足够。
Q5:如何让Python操作Excel时保留原有的公式?
A:openpyxl可以读取公式(cell.data_type=='f'),但写入公式需使用字符串形式:ws['A1'].value = '=SUM(B1:B10)',保存后Excel会自动计算。
总结与扩展建议
本文通过多个案例,演示了Python操作Excel的核心场景:从数据读取、写入更新到样式设置,再到自动化报表生成,掌握这些技能后,你可以:
- 将重复性Excel任务(如日报、周报)完全自动化。
- 结合
matplotlib或plotly在Excel中插入动态图表。 - 使用
pandas进行更复杂的数据透视与合并。
建议下一步学习:
xlwings:直接操控Excel应用程序,适合需要VBA宏替代的场景。pyxlsb:处理二进制格式(.xlsb)的高性能文件。
通过Python与Excel的结合,你将彻底摆脱机械化的表格操作,释放时间专注于更深度的数据分析与决策。
注意:本文案例代码均基于Python 3.10+、openpyxl 3.1.2版本测试通过,若遇操作错误,请检查库版本或数据文件路径。