Python-对excel文件操作的总览

Python 操控 .xlsx 格式的 Excel 文件,核心依赖 第三方库 实现(Python 标准库无原生 Excel 操作能力),不同库适配不同场景:轻量读写用 openpyxl、数据分析用 pandas、复杂格式 / 公式用 xlsxwriter、跨格式兼容用 xlwings。以下从「核心库选型」「安装配置」「高频功能实战」三个维度,结合实际开发场景(如数据写入、格式美化、公式计算、批量编辑)详细讲解,所有代码可直接运行。

一、Python 操控 xlsx 的核心第三方库(选型指南)

不同库的设计目标和适用场景差异极大,先明确选型原则,避免用错工具:

表格

库名称 核心定位 核心优势 局限性 适用场景
openpyxl 纯 Python 实现的 xlsx 读写 / 编辑 支持 .xlsx 全读写、单元格格式、公式、图表 不支持 .xls 格式,大文件处理效率一般 日常 xlsx 读写、单元格级编辑、格式美化
pandas 基于 openpyxl/xlsxwriter 的数据分析 批量数据处理(筛选 / 聚合 / 清洗)、一键读写 不支持复杂单元格格式(需结合 openpyxl) 结构化数据批量处理、报表生成、数据统计
xlsxwriter 高性能 xlsx 写入(只读不写) 支持复杂公式、图表、条件格式、数据透视表 仅支持写入,不支持读取 / 修改已有文件 新建带复杂格式 / 公式的 Excel 报表
xlwings 调用 Excel 应用程序(COM 接口) 支持宏、VBA、Excel 所有原生功能、跨格式 需安装 Microsoft Excel,跨平台性差(仅 Win/Mac) 复杂自动化(宏执行、公式交互、界面操作)
pyxlsb 读取 .xlsb 二进制格式 高效读取超大 .xlsb 文件 仅读取,不支持写入 / 编辑 特殊场景:处理 .xlsb 格式文件

核心选型建议(覆盖 90% 场景):

  1. 日常轻量读写 / 编辑 :优先 openpyxl(无需 Excel 客户端,跨平台);
  2. 数据分析 / 批量处理 :优先 pandas(结合 openpyxl 实现读写 + 格式);
  3. 新建带复杂公式 / 图表的 Excel :用 xlsxwriter
  4. 需要调用 Excel 原生功能(宏 / VBA) :用 xlwings(需装 Excel)。

二、核心库安装(一键命令)

根据场景安装对应库,推荐用 pip 安装(Python 3.7+ 环境):

bash

运行

复制代码
# 基础组合:openpyxl(读写) + pandas(数据分析)(推荐安装)
pip install openpyxl pandas

# 进阶:xlsxwriter(复杂写入) + xlwings(Excel 交互)
pip install xlsxwriter xlwings

# 完整安装(覆盖所有场景)
pip install openpyxl pandas xlsxwriter xlwings pyxlsb

三、高频功能实战(按场景分类,代码可直接运行)

以下按「基础读写」「格式美化」「数据分析」「复杂场景」分类,讲解最常用的功能,所有示例基于 .xlsx 格式。

场景 1:基础读写(openpyxl 核心用法)

openpyxl 是操控 xlsx 的「基础工具」,支持单元格级的读写、新增 / 删除工作表、行 / 列操作,是所有 xlsx 操作的基础。

1.1 新建 xlsx 文件并写入数据

python

运行

python 复制代码
from openpyxl import Workbook

# 1. 创建工作簿对象(默认带一个工作表 Sheet)
wb = Workbook()

# 2. 获取活动工作表(默认第一个)
ws = wb.active
ws.title = "用户信息"  # 重命名工作表

# 3. 写入数据(三种方式)
# 方式1:按单元格坐标写入(A1、B1 等)
ws["A1"] = "姓名"
ws["B1"] = "年龄"
ws["C1"] = "性别"

# 方式2:按行写入(append 方法,批量添加行)
ws.append(["小明", 18, "男"])
ws.append(["小红", 25, "女"])
ws.append(["小刚", 30, "男"])

# 方式3:按行列索引写入(行/列从 1 开始)
ws.cell(row=4, column=2, value=22)  # 第4行第2列(B4)写入 22

# 4. 保存文件(路径可自定义,无文件则新建)
wb.save("基础写入示例.xlsx")
print("文件创建并写入完成!")
1.2 读取已有 xlsx 文件并获取数据

python

python 复制代码
from openpyxl import load_workbook

# 1. 加载已有工作簿(read_only=False 支持编辑,True 仅读取更高效)
wb = load_workbook("基础写入示例.xlsx", read_only=False)

# 2. 获取工作表(三种方式)
ws = wb["用户信息"]  # 按名称获取
# ws = wb.active  # 获取活动工作表
# ws = wb.worksheets[0]  # 按索引获取(第一个工作表)

# 3. 读取数据(四种方式)
# 方式1:按单元格坐标读取
name = ws["A2"].value  # A2 单元格:小明
age = ws["B2"].value   # B2 单元格:18
print(f"读取单个单元格:{name},{age}岁")

# 方式2:按行列索引读取
gender = ws.cell(row=2, column=3).value  # 第2行第3列:男
print(f"按行列读取:{gender}")

# 方式3:读取整行/整列
row2 = [cell.value for cell in ws[2]]  # 读取第2行所有单元格
colB = [cell.value for cell in ws["B"]]  # 读取B列所有单元格
print(f"整行数据:{row2}")
print(f"整列数据:{colB}")

# 方式4:读取指定范围(如 A1:C4)
range_data = []
for row in ws["A1:C4"]:  # 遍历A1到C4的所有行
    row_values = [cell.value for cell in row]
    range_data.append(row_values)
print(f"指定范围数据:{range_data}")

# 4. 关闭工作簿(避免文件占用)
wb.close()
1.3 新增 / 删除工作表、行 / 列

python

复制代码
from openpyxl import load_workbook

wb = load_workbook("基础写入示例.xlsx")

# 1. 新增工作表
ws_new = wb.create_sheet(title="新增工作表", index=1)  # index=1 插入到第二个位置
ws_new["A1"] = "新增数据"

# 2. 删除工作表
if "Sheet" in wb.sheetnames:  # 先判断是否存在
    wb.remove(wb["Sheet"])

# 3. 插入/删除行/列
ws = wb["用户信息"]
ws.insert_rows(2)  # 在第2行插入空行
ws.insert_cols(3)  # 在第3列插入空列
ws.delete_rows(5)  # 删除第5行
ws.delete_cols(4)  # 删除第4列

# 4. 保存修改
wb.save("基础写入示例_修改版.xlsx")
wb.close()
print("工作表/行列操作完成!")

场景 2:格式美化(openpyxl 实现单元格样式)

日常报表需要美化格式(如表头加粗、单元格居中、设置字体 / 颜色、调整列宽),openpyxl 支持完整的样式配置:

python

python 复制代码
from openpyxl import Workbook
from openpyxl.styles import Font, Alignment, PatternFill, Border, Side


# 1. 创建工作簿和工作表
wb = Workbook()
ws = wb.active
ws.title = "格式美化示例"

# 2. 写入基础数据
ws["A1"] = "姓名"
ws["B1"] = "年龄"
ws["C1"] = "薪资"
ws.append(["小明", 18, 8000])
ws.append(["小红", 25, 12000])
ws.append(["小刚", 30, 15000])

# 3. 设置样式
# 3.1 表头样式:加粗、居中、背景色、字体颜色
header_font = Font(name="微软雅黑", size=12, bold=True, color="FFFFFF")  # 白色字体
header_fill = PatternFill(start_color="4472C4", end_color="4472C4", fill_type="solid")  # 蓝色背景
header_alignment = Alignment(horizontal="center", vertical="center")  # 居中对齐
# 给表头行(A1:C1)应用样式
for cell in ws["A1:C1"]:
    cell.font = header_font
    cell.fill = header_fill
    cell.alignment = header_alignment

# 3.2 数据行样式:居中、边框
data_alignment = Alignment(horizontal="center", vertical="center")
border = Border(
    left=Side(style="thin"), right=Side(style="thin"),
    top=Side(style="thin"), bottom=Side(style="thin")
)
# 给数据行(A2:C4)应用样式
for row in ws["A2:C4"]:
    for cell in row:
        cell.alignment = data_alignment
        cell.border = border

# 3.3 调整列宽
ws.column_dimensions["A"].width = 10  # A列宽10
ws.column_dimensions["B"].width = 8   # B列宽8
ws.column_dimensions["C"].width = 12  # C列宽12

# 4. 保存文件
wb.save("格式美化示例.xlsx")
wb.close()
print("格式美化完成!")

场景 3:数据分析与批量处理(pandas 核心用法)

pandas 是处理结构化数据的「利器」,一键读写 Excel,结合数据筛选、聚合、计算,效率远超手动操作:

3.1 批量读取 Excel 并筛选数据

python

运行

复制代码
import pandas as pd

# 1. 读取 Excel 文件(指定工作表、列)
df = pd.read_excel(
    "格式美化示例.xlsx",
    sheet_name="格式美化示例",
    usecols=["姓名", "薪资"]  # 仅读取姓名和薪资列
)

# 2. 数据筛选(薪资>10000的行)
df_filtered = df[df["薪资"] > 10000]
print("筛选后数据:")
print(df_filtered)

# 3. 数据聚合(计算平均薪资)
avg_salary = df["薪资"].mean()
print(f"平均薪资:{avg_salary}")
3.2 批量写入 Excel(多工作表、格式兼容)

python

运行

复制代码
import pandas as pd

# 1. 构造数据
df1 = pd.DataFrame({"姓名": ["小明", "小红"], "年龄": [18, 25]})
df2 = pd.DataFrame({"产品": ["A", "B"], "销量": [100, 200]})

# 2. 写入多个工作表到同一个 Excel
with pd.ExcelWriter("pandas批量写入.xlsx", engine="openpyxl") as writer:
    df1.to_excel(writer, sheet_name="用户数据", index=False)  # index=False 不写行索引
    df2.to_excel(writer, sheet_name="产品数据", index=False)

# 3. 追加数据到已有 Excel(需先读取,再合并,再写入)
wb = pd.ExcelFile("pandas批量写入.xlsx", engine="openpyxl")
df_exist = pd.read_excel(wb, sheet_name="用户数据")
df_new = pd.DataFrame({"姓名": ["小刚"], "年龄": [30]})
df_append = pd.concat([df_exist, df_new], ignore_index=True)  # 合并数据
with pd.ExcelWriter("pandas批量写入.xlsx", engine="openpyxl", mode="a", if_sheet_exists="replace") as writer:
    df_append.to_excel(writer, sheet_name="用户数据", index=False)

print("pandas 批量写入/追加完成!")

场景 4:复杂公式与图表(xlsxwriter 核心用法)

xlsxwriter 擅长创建带 公式、图表、条件格式 的 Excel 文件,适合生成专业报表:

python

复制代码
import xlsxwriter

# 1. 创建工作簿
workbook = xlsxwriter.Workbook("xlsxwriter公式图表示例.xlsx")
worksheet = workbook.add_worksheet("销售数据")

# 2. 写入基础数据
headers = ["产品", "一月", "二月", "三月", "总计"]
worksheet.write_row("A1", headers)  # 写入表头
data = [
    ["A产品", 100, 120, 150],
    ["B产品", 80, 90, 110],
    ["C产品", 150, 130, 140]
]
for row, row_data in enumerate(data, start=1):
    worksheet.write_row(f"A{row+1}", row_data)

# 3. 写入公式(计算总计:E2 = B2+C2+D2)
for row in range(2, 5):
    worksheet.write_formula(f"E{row}", f"=SUM(B{row}:D{row})")

# 4. 添加图表(柱状图)
chart = workbook.add_chart({"type": "column"})
# 配置图表数据:x轴=产品,y轴=总计
chart.add_series({
    "name": "销售总计",
    "categories": "=销售数据!$A$2:$A$4",
    "values": "=销售数据!$E$2:$E$4",
})
chart.set_title({"name": "产品销售总计"})
chart.set_x_axis({"name": "产品"})
chart.set_y_axis({"name": "销量"})
worksheet.insert_chart("G2", chart)  # 插入图表到G2位置

# 5. 关闭工作簿
workbook.close()
print("公式+图表 Excel 创建完成!")

场景 5:调用 Excel 原生功能(xlwings 核心用法)

xlwings 直接调用本地 Excel 应用程序,支持 宏执行、VBA 交互、Excel 界面操作(需安装 Microsoft Excel):

python

运行

复制代码
import xlwings as xw

# 1. 打开 Excel 应用(visible=True 显示界面,False 后台运行)
app = xw.App(visible=True, add_book=False)

# 2. 打开已有工作簿(或新建:wb = app.books.add())
wb = app.books.open("基础写入示例.xlsx")
ws = wb.sheets["用户信息"]

# 3. 操作数据(与 Excel 原生交互)
ws.range("D1").value = "新增列"  # 写入新列名
ws.range("D2:D4").value = ["北京", "上海", "广州"]  # 批量写入

# 4. 执行 Excel 原生公式/函数
ws.range("E2").formula = "=B2+5"  # E2 = B2+5

# 5. 保存并关闭
wb.save("xlwings交互示例.xlsx")
wb.close()
app.quit()  # 关闭 Excel 应用
相关推荐
2501_941982052 小时前
Python 实现企业微信外部群机器人:轻量化消息推送方案
python·机器人·企业微信
knighthood20012 小时前
ROS1中source xxx.bash失效
开发语言·bash
骇客野人2 小时前
python爬虫例子,且处理反爬的网站也能爬
开发语言·爬虫·python
hutengyi2 小时前
SpringBoot项目中读取resource目录下的文件(六种方法)
spring boot·python·pycharm
林月明2 小时前
【Coze基础】Excel保存CSV文件时其设置为UTF-8编码,将数据导入数据库中
数据库·sql·oracle·excel·code·学习经验
老天文学家了2 小时前
蓝桥杯:直线
python
howard20052 小时前
Pandas读取包含多个工作表的Excel文件
excel·pandas
程序员在线炒粉8元1份顺丰包邮送可乐2 小时前
【Java 实现】用友 BIP V5 版本与飞书集成单点登录(飞书免密登录到用友 ERP)
java·开发语言·飞书·用友 bip
铁手飞鹰2 小时前
eBUS SDK Python环境安装
开发语言·python