Python 自动化 Excel读取 Excel 文件(指定工作表、指定列、指定行)详细教程
在日常办公和数据处理工作中,Excel文件是最常用的数据存储格式之一。Python提供了丰富的库来处理Excel文件,本文将详细介绍如何使用Python读取Excel文件,包括指定工作表、指定列、指定行等高级操作,所有代码均可直接复制使用。
一、环境准备
1.1 安装依赖库
Python处理Excel主要使用两个库:
安装命令:
bash
pip install pandas openpyxl xlrd
1.2 版本兼容性说明
二、基础读取操作
2.1 读取整个Excel文件
python
import pandas as pd
# 读取Excel文件,默认读取第一个工作表
df = pd.read_excel('data.xlsx', engine='openpyxl')
# 查看数据前5行
print(df.head())
# 查看数据基本信息
print(df.info())
2.2 指定工作表读取
Excel文件通常包含多个工作表,有三种方式指定要读取的工作表:
方法1:通过工作表名称指定
python
# 读取名为"销售数据"的工作表
df = pd.read_excel('data.xlsx', sheet_name='销售数据', engine='openpyxl')
方法2:通过索引指定(从0开始)
python
# 读取第2个工作表(索引为1)
df = pd.read_excel('data.xlsx', sheet_name=1, engine='openpyxl')
方法3:读取多个工作表
python
# 同时读取第一个和第三个工作表
dfs = pd.read_excel('data.xlsx', sheet_name=[0, 2], engine='openpyxl')
print(dfs[0]) # 第一个工作表数据
print(dfs[2]) # 第三个工作表数据
# 读取所有工作表
all_dfs = pd.read_excel('data.xlsx', sheet_name=None, engine='openpyxl')
for sheet_name, df in all_dfs.items():
print(f"工作表名称: {sheet_name}")
print(df.head())
三、高级读取操作
3.1 指定读取的列
当Excel文件列很多,而我们只需要部分列时,可以通过`usecols`参数指定要读取的列,提升读取效率。
方法1:通过列名指定
python
# 只读取"姓名"、"销售额"、"日期"三列
df = pd.read_excel('data.xlsx',
sheet_name='销售数据',
usecols=['姓名', '销售额', '日期'],
engine='openpyxl')
方法2:通过列索引指定(从0开始)
python
# 读取第1列、第3列、第5列
df = pd.read_excel('data.xlsx',
sheet_name='销售数据',
usecols=[0, 2, 4],
engine='openpyxl')
方法3:通过列范围指定
python
# 读取A列到E列(等价于第0-4列)
df = pd.read_excel('data.xlsx',
sheet_name='销售数据',
usecols='A:E',
engine='openpyxl')
# 读取A、C、E列
df = pd.read_excel('data.xlsx',
sheet_name='销售数据',
usecols='A,C,E',
engine='openpyxl')
方法4:通过函数筛选列
python
# 只读取列名包含"金额"的列
def filter_columns(col_name):
return '金额' in col_name
df = pd.read_excel('data.xlsx',
sheet_name='销售数据',
usecols=filter_columns,
engine='openpyxl')
3.2 指定读取的行
通过`skiprows`和`nrows`参数可以灵活控制读取的行数。
3.2.1 跳过开头的行
python
# 跳过前2行(通常是标题或说明行),从第3行开始读取
df = pd.read_excel('data.xlsx',
sheet_name='销售数据',
skiprows=2,
engine='openpyxl')
3.2.2 读取指定行数
python
# 只读取前100行数据
df = pd.read_excel('data.xlsx',
sheet_name='销售数据',
nrows=100,
engine='openpyxl')
3.2.3 组合使用,读取指定范围的行
python
# 跳过前5行,然后读取100行(即读取第6行到第105行)
df = pd.read_excel('data.xlsx',
sheet_name='销售数据',
skiprows=5,
nrows=100,
engine='openpyxl')
3.2.4 更灵活的行筛选
如果需要更复杂的行筛选,可以先读取全部数据,再通过条件过滤:
python
# 先读取全部数据
df = pd.read_excel('data.xlsx', sheet_name='销售数据', engine='openpyxl')
# 筛选销售额大于10000的行
df_filtered = df[df['销售额'] > 10000]
# 筛选日期在2026年1月的行
df['日期'] = pd.to_datetime(df['日期'])
df_january = df[df['日期'].dt.month == 1]
# 筛选第10行到第20行(索引从0开始)
df_range = df.iloc[9:20]
四、完整示例代码
下面是一个完整的示例,演示如何读取指定工作表、指定列、指定行:
python
import pandas as pd
# 配置参数
file_path = '销售数据.xlsx'
sheet_name = '2026年销售'
usecols = ['日期', '区域', '销售人员', '产品名称', '销售额', '利润']
skiprows = 2 # 跳过前两行表头
nrows = 500 # 读取500行数据
# 读取数据
df = pd.read_excel(
file_path,
sheet_name=sheet_name,
usecols=usecols,
skiprows=skiprows,
nrows=nrows,
engine='openpyxl'
)
# 数据处理示例
print("=== 数据基本信息 ===")
print(df.info())
print("\n=== 前10行数据 ===")
print(df.head(10))
print("\n=== 销售额统计 ===")
print(f"总销售额: {df['销售额'].sum():.2f}元")
print(f"平均销售额: {df['销售额'].mean():.2f}元")
print(f"最高销售额: {df['销售额'].max():.2f}元")
print(f"最低销售额: {df['销售额'].min():.2f}元")
# 按区域分组统计
print("\n=== 各区域销售统计 ===")
area_stats = df.groupby('区域')['销售额'].agg(['sum', 'mean', 'count'])
print(area_stats)
# 保存处理后的数据
df.to_excel('销售统计结果.xlsx', index=False)
print("\n✅ 处理完成,结果已保存到'销售统计结果.xlsx'")
五、使用openpyxl精细化操作
如果需要更精细化的控制(比如读取单元格样式、公式等),可以直接使用openpyxl库:
python
from openpyxl import load_workbook
# 加载工作簿
wb = load_workbook('data.xlsx', read_only=True)
# 获取所有工作表名称
print("工作表列表:", wb.sheetnames)
# 选择工作表
ws = wb['销售数据']
# 读取指定单元格
print("A1单元格值:", ws['A1'].value)
print("第2行第3列值:", ws.cell(row=2, column=3).value)
# 读取指定范围的行和列
print("\n=== 读取第3行到第10行,第2列到第5列 ===")
for row in ws.iter_rows(min_row=3, max_row=10, min_col=2, max_col=5, values_only=True):
print(row)
# 关闭工作簿
wb.close()
六、常见问题与解决方案
6.1 读取大文件内存不足
问题:Excel文件太大,读取时内存不足
解决方案:
python
# 使用分块读取
chunk_size = 1000 # 每次读取1000行
for chunk in pd.read_excel('large_data.xlsx', sheet_name='数据', chunksize=chunk_size, engine='openpyxl'):
# 处理每个数据块
process_chunk(chunk)
6.2 日期格式读取异常
问题:Excel中的日期读取后变成了数字
解决方案:
python
# 读取时指定日期列
df = pd.read_excel('data.xlsx',
parse_dates=['日期列名'],
date_parser=lambda x: pd.to_datetime(x, format='%Y-%m-%d'),
engine='openpyxl')
# 或者读取后转换
df['日期'] = pd.to_datetime(df['日期'], unit='D', origin='1899-12-30')
6.3 中文列名乱码
问题:读取后中文列名显示乱码
解决方案:
python
# 确保文件保存为UTF-8编码,或者读取时指定编码
df = pd.read_excel('data.xlsx', engine='openpyxl', encoding='utf-8')
# 如果还是乱码,尝试使用gbk编码
df = pd.read_excel('data.xlsx', engine='openpyxl', encoding='gbk')
6.4 合并单元格读取问题
问题:合并单元格读取后只有第一个单元格有值,其他为空
解决方案:
python
from openpyxl import load_workbook
from openpyxl.utils import get_column_letter
wb = load_workbook('data.xlsx')
ws = wb.active
# 处理合并单元格
for merged_cell in ws.merged_cells.ranges:
# 获取合并单元格的值
value = ws[merged_cell.min_row][merged_cell.min_col - 1].value
# 为合并区域的所有单元格赋值
for row in range(merged_cell.min_row, merged_cell.max_row + 1):
for col in range(merged_cell.min_col, merged_cell.max_col + 1):
ws.cell(row=row, column=col, value=value)
6.5 密码保护的Excel文件
问题:Excel文件设置了密码,无法直接读取
解决方案:需要使用第三方库解密
bash
pip install msoffcrypto-tool
python
import msoffcrypto
import io
decrypted = io.BytesIO()
with open('encrypted.xlsx', 'rb') as f:
file = msoffcrypto.OfficeFile(f)
file.load_key(password='你的密码') # 提供密码
file.decrypt(decrypted)
# 读取解密后的文件
df = pd.read_excel(decrypted, engine='openpyxl')
七、性能优化建议
1. 只读取需要的列:使用`usecols`参数减少数据读取量
2. 分块读取大文件:使用`chunksize`参数分块处理
3. 指定数据类型:使用`dtype`参数指定列类型,避免自动类型推断消耗性能
4. 使用openpyxl只读模式:处理大文件时开启`read_only=True`提升性能
通过以上方法,你可以灵活控制Excel文件的读取过程,满足各种复杂场景下的数据处理需求。这些方法在自动化办公、数据分析、报表生成等场景中都非常实用,可以大幅提升工作效率。