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% 场景):
- 日常轻量读写 / 编辑 :优先
openpyxl(无需 Excel 客户端,跨平台); - 数据分析 / 批量处理 :优先
pandas(结合openpyxl实现读写 + 格式); - 新建带复杂公式 / 图表的 Excel :用
xlsxwriter; - 需要调用 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 应用