You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python标准库读取.xlsx文件中所有格式一致的工作表?

读取Excel所有格式一致工作表为字典列表的改写方案

原代码仅能处理单个工作表(sheet1),要实现读取所有格式一致的工作表,核心思路是枚举所有工作表文件,再复用原有的数据解析逻辑批量处理。以下是改写后的完整实现:

import zipfile
from xml.etree.ElementTree import iterparse

def read_all_excel_sheets(fname):
    z = zipfile.ZipFile(fname)
    # 读取共享字符串表(所有工作表共用,仅需读取一次)
    strings = [el.text for e, el in iterparse(z.open('xl/sharedStrings.xml')) if el.tag.endswith('}t')]
    
    # 封装单个工作表的解析逻辑
    def process_sheet(sheet_path):
        rows = []
        row = {}
        value = ''
        for e, el in iterparse(z.open(sheet_path)):
            if el.tag.endswith('}v'): 
                value = el.text
            if el.tag.endswith('}c'):                                  
                # 处理共享字符串类型的单元格
                if el.attrib.get('t') == 's':
                    value = strings[int(value)] if value else ''
                # 提取列标识字母(如A、B、C)
                letter = el.attrib['r']                          
                while letter[-1].isdigit():
                    letter = letter[:-1]
                row[letter] = value
                value = ''
            if el.tag.endswith('}row'):
                # 注意:必须复制字典对象,避免后续修改覆盖已存入的行数据
                rows.append(row.copy())
                row = {}
        return rows
    
    # 获取所有工作表的文件路径
    sheet_paths = [
        path for path in z.namelist() 
        if path.startswith('xl/worksheets/sheet') and path.endswith('.xml')
    ]
    # 按工作表编号排序,保证Sheet1、Sheet2的顺序与Excel一致
    sheet_paths.sort(key=lambda x: int(x.split('sheet')[-1].split('.')[0]))
    
    # 批量处理所有工作表,结果以「工作表名: 数据列表」的字典形式返回
    all_sheets_data = {}
    for path in sheet_paths:
        sheet_num = path.split('sheet')[-1].split('.')[0]
        sheet_name = f"Sheet{sheet_num}"
        all_sheets_data[sheet_name] = process_sheet(path)
    
    return all_sheets_data

关键改动说明

  • 复用共享字符串表:Excel的共享字符串表(sharedStrings.xml)是所有工作表共用的,无需重复读取,提升效率
  • 封装解析函数:把原有的单表解析逻辑抽成独立函数,避免代码重复,同时让逻辑更清晰
  • 修复原代码的隐藏问题:原代码中rows.append(row)会导致所有行引用同一个字典对象,后续修改row会覆盖已添加的行数据,改为row.copy()解决此问题
  • 枚举并排序工作表:通过zipfile.ZipFile.namelist()筛选所有工作表文件,再按编号排序,保证处理顺序与Excel中的工作表顺序一致
  • 分类存储结果:最终返回的字典以工作表名为键,对应值是该表的字典列表,方便区分不同工作表的数据

使用示例

调用函数后,你可以按工作表名获取对应数据:

data = read_all_excel_sheets("your_file.xlsx")
# 获取Sheet1的数据
sheet1_data = data["Sheet1"]
# 遍历Sheet2的每一行
for row in data["Sheet2"]:
    print(row)

内容的提问来源于stack exchange,提问作者Justin Flores

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 18:55:40