如何用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
相关产品推荐
相关产品推荐

