Python自动化Excel读取详细教程:指定工作表、指定列、指定行实战指南


Python自动化Excel读取详细教程:指定工作表、指定列、指定行实战指南

Python 自动化 Excel读取 Excel 文件(指定工作表、指定列、指定行)详细教程

在日常办公和数据处理工作中,Excel文件是最常用的数据存储格式之一。Python提供了丰富的库来处理Excel文件,本文将详细介绍如何使用Python读取Excel文件,包括指定工作表、指定列、指定行等高级操作,所有代码均可直接复制使用。

一、环境准备

1.1 安装依赖库

Python处理Excel主要使用两个库:

  • **pandas**:数据处理利器,适合批量数据分析
  • **openpyxl**:专门处理.xlsx格式文件,支持读写操作
  • **xlrd**:支持读取.xls格式(旧版Excel)
  • 安装命令:

    bash
    pip install pandas openpyxl xlrd
    

    1.2 版本兼容性说明

  • xlrd 2.0+版本不再支持.xlsx格式,如需读取.xlsx建议使用openpyxl引擎
  • 推荐统一使用pandas + openpyxl组合,兼容性最好
  • 二、基础读取操作

    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文件的读取过程,满足各种复杂场景下的数据处理需求。这些方法在自动化办公、数据分析、报表生成等场景中都非常实用,可以大幅提升工作效率。

    © 版权声明

    相关文章

    暂无评论

    none
    暂无评论...