如何用Pandas筛选并合并Excel指定范围的可见工作表数据?
Pandas实现指定范围可见工作表数据提取与合并
核心思路拆解
- 先筛选出所有可见工作表并保留原始顺序
- 定位起始工作表
Main Frames BUP 1的位置 - 找到第一个含
panel的工作表位置,作为提取终止点(不包含该表) - 逐个读取目标工作表的指定区域,过滤全空行后合并
- 输出到单个Excel文件
修正后的完整代码
import os import pandas as pd # 用户从GUI选择的文件路径 xl = values["-xl_file-"] loc = os.path.dirname(xl) # 读取Excel文件 xls = pd.ExcelFile(xl) sheets = xls.book.worksheets # 1. 筛选所有可见工作表,保留原始顺序 visible_sheets = [sheet for sheet in sheets if sheet.sheet_state == 'visible'] # 2. 定位起始工作表的索引 start_idx = None for idx, sheet in enumerate(visible_sheets): if sheet.title == 'Main Frames BUP 1': start_idx = idx break # 3. 找到第一个含'panel'的工作表索引(作为终止点,不包含该表) end_idx = len(visible_sheets) for idx in range(start_idx, len(visible_sheets)): # 不区分大小写匹配'panel',可根据需求调整为大小写敏感 if 'panel' in visible_sheets[idx].title.lower(): end_idx = idx break # 4. 遍历目标工作表,读取数据并收集 dfs = [] for sheet in visible_sheets[start_idx:end_idx]: # 读取M6:AD37区域:skiprows=5(跳过前5行,从第6行开始),nrows=32(共32行),usecols='M:AD' df = pd.read_excel( xls, sheet_name=sheet.title, header=None, skiprows=5, nrows=32, usecols='M:AD' ) # 过滤全空行 df = df.dropna(how='all') dfs.append(df) # 5. 合并所有数据 final_df = pd.concat(dfs, ignore_index=True) # 6. 保存结果到新Excel文件 with pd.ExcelWriter(f'{loc}/merged_data.xlsx') as writer: final_df.to_excel(writer, sheet_name='Merged', index=False)
关键代码说明
- 筛选可见工作表:通过列表推导式过滤出
sheet_state为visible的工作表,确保只处理符合要求的表 - 定位起始/终止点:遍历可见工作表列表,分别找到起始表的索引和第一个含
panel的表索引,以此截取需要处理的工作表子集 - 读取指定区域:
skiprows=5对应跳过前5行(从Excel第6行开始,即M6),nrows=32对应读取到第37行,usecols='M:AD'指定读取的列范围 - 过滤全空行:使用
dropna(how='all')移除所有单元格为空的无效行 - 合并数据:先将每个工作表的DataFrame存入列表,最后一次性执行
concat,避免循环中重复合并的性能损耗 - 保存文件:用
with语句管理ExcelWriter,确保文件自动正确关闭
内容的提问来源于stack exchange,提问作者Rand0mdude
相关产品推荐
相关产品推荐

