主流库对比
| 库 | 主要特点 | 适用场景 | 备注 |
|---|---|---|---|
pandas |
数据分析和处理的行业标准,语法简洁,功能强大,能轻松读取数据并转换为 DataFrame。 | 数据清洗、数据分析、统计计算、数据可视化。 | 强烈推荐初学者和大多数用户使用,它本身依赖 openpyxl 或 xlrd。 |
openpyxl |
功能全面的读写库,能读取、写入和修改 .xlsx 文件,并保留格式(如字体、颜色、图表等)。 |
需要精确控制 Excel 文件内容、样式、公式或进行复杂修改的场景。 | 功能强大,但代码比 pandas 稍显繁琐。 |
xlrd / xlwt |
xlrd 只能读旧版 .xls 文件,xlwt 只能写旧版 .xls 文件。 |
处理非常古老的 Excel 文件(.xls 格式)。 |
不推荐用于新项目,.xls 格式已过时。xlrd 对新版 .xlsx 的支持有限。 |
pyxlsb |
专门用于读取 Excel 二进制工作簿(.xlsb)格式。 |
处理由 Excel 生成的、体积更小的 .xlsb 文件。 |
如果你需要处理这种特定格式,它是最佳选择。 |
使用 pandas (最推荐)
pandas 是数据科学领域的瑞士军刀,处理 Excel 数据最为便捷,它内部会调用 openpyxl(针对 .xlsx)或 xlrd(针对旧版 .xls)来完成实际操作。

安装
pip install pandas openpyxl # openpyxl 是处理 .xlsx 文件所必需的依赖
基本用法
示例 Excel 文件 (sales_data.xlsx)
假设我们有如下一个简单的 Excel 文件:
| Product | Sales_Region | Q1_Sales | Q2_Sales |
|---|---|---|---|
| Laptop | East | 50000 | 60000 |
| Mouse | West | 20000 | 25000 |
| Keyboard | North | 15000 | 18000 |
| Monitor | South | 45000 | 48000 |
读取 Excel 文件
import pandas as pd
# --- 读取整个工作表 ---
# 默认读取第一个工作表
df = pd.read_excel('sales_data.xlsx')
print("默认读取第一个工作表:")
print(df)
print("\n")
# --- 读取指定工作表 ---
# Excel 文件可能有多个工作表 (Sheet1, Sheet2, ...)
df_sheet2 = pd.read_excel('sales_data.xlsx', sheet_name='Sheet2') # 假设有一个叫 Sheet2 的工作表
print("读取指定工作表 'Sheet2':")
print(df_sheet2)
print("\n")
# --- 读取多个工作表 ---
# 返回一个字典,键是工作表名,值是对应的 DataFrame
all_sheets = pd.read_excel('sales_data.xlsx', sheet_name=['Sheet1', 'Sheet2'])
print("读取多个工作表,返回字典:")
print(all_sheets['Sheet1']) # 访问第一个工作表
print("\n")
# --- 读取所有工作表 ---
# sheet_name=None 会读取所有工作表
all_sheets = pd.read_excel('sales_data.xlsx', sheet_name=None)
print("读取所有工作表,返回字典:")
print(list(all_sheets.keys())) # 查看所有工作表名
print("\n")
# --- 指定索引列 ---
# 假设 'Product' 列更适合作为索引
df_indexed = pd.read_excel('sales_data.xlsx', index_col='Product')
print("指定 'Product' 为索引列:")
print(df_indexed)
print("\n")
# --- 指定列名 ---
# Excel 文件没有标题行,或者你想用新的列名
# header=None 表示文件没有标题行
# names 参数用于指定新的列名
df_no_header = pd.read_excel('sales_data.xlsx', header=None, names=['产品', '区域', '第一季度', '第二季度'])
print("指定新的列名:")
print(df_no_header)
print("\n")
# --- 只读取特定列 ---
df_specific_cols = pd.read_excel('sales_data.xlsx', usecols=['Product', 'Q1_Sales'])
print("只读取 'Product' 和 'Q1_Sales' 列:")
print(df_specific_cols)
print("\n")
写入 Excel 文件
# 创建一个新的 DataFrame
new_data = {
'Product': ['Webcam', 'Microphone'],
'Sales_Region': ['East', 'West'],
'Q1_Sales': [8000, 12000],
'Q2_Sales': [9500, 14000]
}
new_df = pd.DataFrame(new_data)
# 写入新的 Excel 文件
# index=False 表示不将 DataFrame 的索引写入 Excel
new_df.to_excel('new_sales_data.xlsx', index=False, sheet_name='New_Products')
print("已成功创建 new_sales_data.xlsx 文件")
使用 openpyxl
openpyxl 更底层,可以精确控制单元格的样式、公式、合并单元格等,但代码量会比 pandas 多。
安装
pip install openpyxl
基本用法
读取 Excel 文件
from openpyxl import load_workbook
# --- 加载工作簿 ---
# data_only=True 表示读取单元格的值(而不是公式)
# read_only=True 以只读模式打开,适合大文件,但不能修改
wb = load_workbook(filename='sales_data.xlsx', data_only=True)
# --- 获取工作表 ---
# 通过名称获取
sheet = wb['Sheet1']
# 或者通过索引获取 (从0开始)
# sheet = wb.worksheets[0]
# --- 读取单个单元格 ---
product_a = sheet['A1'].value
q1_sales_b2 = sheet['B2'].value
print(f"A1 单元格的值: {product_a}")
print(f"B2 单元格的值: {q1_sales_b2}")
print("-" * 20)
# --- 读取一行 ---
row_2_values = []
for cell in sheet[2]: # 第二行
row_2_values.append(cell.value)
print(f"第二行的所有值: {row_2_values}")
print("-" * 20)
# --- 读取一列 ---
col_a_values = []
for row in sheet.iter_rows(min_col=1, max_col=1, values_only=True): # 第一列
col_a_values.append(row[0])
print(f"第一列的所有值: {col_a_values}")
print("-" * 20)
# --- 遍历整个工作表 ---
print("遍历整个工作表:")
for row in sheet.iter_rows(values_only=True):
print(row)
print("-" * 20)
# 关闭工作簿
wb.close()
写入和修改 Excel 文件
from openpyxl import Workbook
from openpyxl.styles import Font
# --- 创建一个新的工作簿 ---
wb_new = Workbook()
# --- 获取默认创建的工作表并重命名 ---
ws = wb_new.active= "Summary"
# --- 写入数据 ---
ws['A1'] = "Report Summary"
ws['A2'] = "Total Products"
ws['B2'] = 5
# --- 应用样式 ---
# 给 A1 单元格加粗
ws['A1'].font = Font(bold=True, size=14)
# --- 保存工作簿 ---
wb_new.save('summary_report.xlsx')
print("已成功创建 summary_report.xlsx 文件")
如何选择?
-
如果你只想处理 Excel 中的数据(读取、分析、清洗、计算、再导出):
- 首选
pandas,它更简单、更高效,代码更易读,这是 90% 情况下的最佳选择。
- 首选
-
如果你需要精确地操作 Excel 文件本身:
(图片来源网络,侵删)- 修改单元格的颜色、字体、边框、合并单元格、插入图片、读取/写入公式、调整行高列宽等。
- 使用
openpyxl,它提供了对 Excel 文件结构的底层控制。
-
如果你处理的是旧版的
.xls文件:- 使用
xlrd(读) 和xlwt(写),但请注意它们不再积极维护。
- 使用
-
如果你处理的是
.xlsb文件:- 使用
pyxlsb。
- 使用
对于初学者和绝大多数数据分析任务,从 pandas 开始是最好的选择,它能让你快速上手并完成核心的数据处理工作,当你发现需要对 Excel 文件的格式进行精细控制时,再深入学习和使用 openpyxl。

