作为开发者/数据从业者,日常工作中难免要和 Excel 打交道------批量修改单元格、合并多表数据、生成可视化报表,这些重复劳动往往占用大量时间。Excel 自带的函数虽能解决简单问题,但面对上万行数据或复杂逻辑时,不仅卡顿还容易出错。
而 Python 凭借 pandas 和 openpyxl 等库,能以「代码化」方式实现 Excel 自动化处理,效率提升 10 倍以上。本文将从环境搭建到实战案例,手把手教你用 Python 搞定 Excel 常见需求,新手也能快速上手!
一、环境准备:核心库安装
首先需要安装两个关键库,直接通过 pip 命令执行即可(建议使用 Python 3.7+ 版本):
安装 pandas(数据处理核心库,支持 Excel 读写)
pip install pandas
安装 openpyxl(处理 .xlsx 格式文件,支持单元格样式、公式等)
pip install openpyxl
若需处理 .xls 格式,额外安装 xlrd(注意:xlrd 2.0+ 不支持 .xls,需指定版本)
pip install xlrd==1.2.0
安装完成后,在代码中导入库:
import pandas as pd
from openpyxl.styles import Font, PatternFill # 用于设置单元格样式
二、基础操作:Excel 读写核心用法
- 读取 Excel 文件
pandas 的 read_excel() 方法支持读取单个工作表、指定列、跳过表头,满足不同场景需求:
1. 读取整个 Excel 文件(默认读取第一个工作表)
df = pd.read_excel("数据文件.xlsx")
2. 读取指定工作表(通过 sheet_name 指定名称或索引)
df = pd.read_excel("数据文件.xlsx", sheet_name="销售数据") # 按名称
df = pd.read_excel("数据文件.xlsx", sheet_name=1) # 按索引(从 0 开始)
3. 读取指定列(通过 usecols 参数)
df = pd.read_excel("数据文件.xlsx", usecols=["日期", "销售额", "地区"])
4. 跳过表头(适用于无表头的文件,通过 skiprows 指定行数)
df = pd.read_excel("数据文件.xlsx", skiprows=1, header=None) # header=None 表示无表头
查看数据前 5 行,验证读取结果
print(df.head())
- 写入 Excel 文件
处理完数据后,用 to_excel() 方法写入文件,支持设置索引、表头样式:
1. 基础写入(默认包含索引列)
df.to_excel("处理后的数据.xlsx", index=False) # index=False 不写入索引列
2. 写入多个工作表(使用 ExcelWriter)
with pd.ExcelWriter("多工作表文件.xlsx", engine="openpyxl") as writer:
df1.to_excel(writer, sheet_name="工作表1", index=False)
df2.to_excel(writer, sheet_name="工作表2", index=False)
3. 简单设置单元格样式(结合 openpyxl)
workbook = openpyxl.load_workbook("处理后的数据.xlsx")
worksheet = workbook.active
设置表头字体为黑体、红色,背景为浅灰色
header_font = Font(name="黑体", color="FF0000", bold=True)
header_fill = PatternFill(start_color="E6E6E6", end_color="E6E6E6", fill_type="solid")
for cell in worksheet[1]: # 第 1 行为表头
cell.font = header_font
cell.fill = header_fill
workbook.save("处理后的数据(带样式).xlsx")
三、实战案例:解决 3 个高频需求
案例 1:批量合并多 Excel 文件(同结构)
场景:有 10 个销售数据文件(均为「日期+地区+销售额」列),需合并为一个总表。
import os
import pandas as pd
1. 定义文件路径(所有 Excel 文件放在同一文件夹)
file_path = "销售数据文件夹"
file_list = [f for f in os.listdir(file_path) if f.endswith(".xlsx")]
2. 创建空列表,存储所有数据
all_data = []
3. 循环读取每个文件,添加到列表
for file in file_list:
file_full_path = os.path.join(file_path, file)
df = pd.read_excel(file_full_path, usecols=["日期", "地区", "销售额"])
可选:添加「来源文件」列,便于追溯数据
df["来源文件"] = file
all_data.append(df)
4. 合并所有数据(忽略索引)
merged_df = pd.concat(all_data, ignore_index=True)
5. 写入总表
merged_df.to_excel("合并后的销售总表.xlsx", index=False)
print(f"合并完成!共 {len(merged_df)} 条数据")
案例 2:按条件筛选并修改数据
场景:筛选出「销售额 > 10000」的记录,将这些记录的「地区」列改为「重点区域」。
import pandas as pd
读取数据
df = pd.read_excel("销售总表.xlsx")
1. 筛选条件:销售额 > 10000
condition = df["销售额"] > 10000
high_sales_df = df[condition].copy() # copy() 避免警告
2. 修改「地区」列
high_sales_df["地区"] = "重点区域"
3. 替换原数据中的对应行(通过索引匹配)
df.loc[condition] = high_sales_df
4. 保存修改后的数据
df.to_excel("销售总表(已标注重点区域).xlsx", index=False)
print(f"筛选出 {len(high_sales_df)} 条重点区域数据")
案例 3:生成数据汇总报表(分组统计+可视化)
场景:按「地区」分组统计总销售额、平均销售额,生成汇总表并插入柱状图。
import pandas as pd
import matplotlib.pyplot as plt
from openpyxl import load_workbook
from openpyxl.drawing.image import Image
1. 读取数据并分组统计
df = pd.read_excel("销售总表.xlsx")
summary_df = df.groupby("地区").agg({
"销售额": ["sum", "mean", "count"] # 总销售额、平均销售额、记录数
}).round(2) # 保留 2 位小数
重命名列名(避免多级索引)
summary_df.columns = ["总销售额", "平均销售额", "数据条数"]
summary_df.reset_index(inplace=True) # 地区列从索引变为普通列
2. 保存汇总表
summary_df.to_excel("地区销售汇总表.xlsx", index=False)
3. 生成柱状图(可视化总销售额)
plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决中文显示问题
plt.figure(figsize=(10, 6))
plt.bar(summary_df["地区"], summary_df["总销售额"], color="#1f77b4")
plt.title("各地区总销售额对比", fontsize=14, fontweight="bold")
plt.xlabel("地区", fontsize=12)
plt.ylabel("总销售额(元)", fontsize=12)
plt.xticks(rotation=45) # 地区名称旋转 45 度,避免重叠
plt.tight_layout() # 自动调整布局
plt.savefig("地区销售额柱状图.png", dpi=300) # 保存图片
4. 将图片插入 Excel 汇总表
workbook = load_workbook("地区销售汇总表.xlsx")
worksheet = workbook.active
img = Image("地区销售额柱状图.png")
img.width = 600 # 调整图片宽度
img.height = 400 # 调整图片高度
worksheet.add_image(img, "E2") # 插入到 E2 单元格
workbook.save("地区销售汇总表(含图表).xlsx")
print("汇总报表生成完成!")
四、常见问题与避坑指南
-
编码错误:读取 Excel 时若出现编码报错,在 read_excel() 中添加 encoding="utf-8" 或 encoding="gbk"。
-
数据类型问题:日期列可能被读取为字符串,需用 df["日期"] = pd.to_datetime(df["日期"]) 转换为日期类型。
-
大文件处理:当 Excel 文件超过 10 万行,建议使用 chunksize 分块读取:
for chunk in pd.read_excel("大文件.xlsx", chunksize=10000):
逐块处理数据
- 公式失效:pandas 写入的公式需在 Excel 中「启用编辑」才能生效,若需直接显示计算结果,可在写入前用 df = df.compute() 计算。
五、总结
本文介绍了 Python 处理 Excel 的核心用法,从基础的读写操作到合并文件、条件筛选、报表生成等实战场景,覆盖了工作中 80% 的需求。通过代码化方式处理 Excel,不仅能节省大量重复劳动,还能保证数据处理的准确性和可复用性。
如果本文对你有帮助,欢迎点赞、收藏、转发!若有其他具体场景需求(如 Excel 公式批量应用、复杂表格样式设置)