为什么用 Python 处理 Excel?

作为开发者/数据从业者,日常工作中难免要和 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 读写核心用法

  1. 读取 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())

  1. 写入 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("汇总报表生成完成!")

四、常见问题与避坑指南

  1. 编码错误:读取 Excel 时若出现编码报错,在 read_excel() 中添加 encoding="utf-8" 或 encoding="gbk"。

  2. 数据类型问题:日期列可能被读取为字符串,需用 df["日期"] = pd.to_datetime(df["日期"]) 转换为日期类型。

  3. 大文件处理:当 Excel 文件超过 10 万行,建议使用 chunksize 分块读取:

for chunk in pd.read_excel("大文件.xlsx", chunksize=10000):

逐块处理数据

  1. 公式失效:pandas 写入的公式需在 Excel 中「启用编辑」才能生效,若需直接显示计算结果,可在写入前用 df = df.compute() 计算。

五、总结

本文介绍了 Python 处理 Excel 的核心用法,从基础的读写操作到合并文件、条件筛选、报表生成等实战场景,覆盖了工作中 80% 的需求。通过代码化方式处理 Excel,不仅能节省大量重复劳动,还能保证数据处理的准确性和可复用性。

如果本文对你有帮助,欢迎点赞、收藏、转发!若有其他具体场景需求(如 Excel 公式批量应用、复杂表格样式设置)

相关推荐
artificiali4 小时前
强 第六章 应用层
计算机网络·应用层·408
YYYing.5 小时前
【计算机网络 | 第五篇】计网之链路层
网络·网络协议·tcp/ip·计算机网络
不穿格子的程序员7 小时前
计算机网络篇3:键入网址到网页显示过程+getpost区别+syn攻击+cdn
计算机网络·cdn·syn·get and post
九成宫1 天前
计算机网络期末复习——第4章:网络层 Part Three
网络·笔记·计算机网络·软件工程
今儿敲了吗1 天前
计算机网络第四章笔记(一)
笔记·计算机网络
zjun10011 天前
字节-2.位运算
计算机网络
YYYing.1 天前
【计算机网络 | 第四篇】路由与NAT技术
运维·服务器·网络·网络协议·计算机网络
CS创新实验室1 天前
《计算机网络》深入学:流量控制与可靠传输
计算机网络·考研·计算机·408
Tandy12356_1 天前
手写TCP/IP协议栈——TCP数据接收
c语言·网络·网络协议·tcp/ip·计算机网络