Pandas合并Excel多工作表DataFrame导出JSON仅存最后数据问题
问题原因
你的代码出现该问题是核心逻辑层级写错了:
pd.concat的调用位置放在了单工作表遍历循环内部,且每次只传入当前单个工作表的DataFrame做拼接,完全没有实现跨工作表合并的作用- JSON导出逻辑也放在了单工作表循环内,每遍历一个工作表就会覆盖一次同名JSON文件,循环结束后文件里自然只剩最后一个工作表的数据
- 没有为单个Excel文件设置临时存储区累积所有工作表的数据,自然没法生成单文件对应的全量合并DataFrame
- 最后一行
pd.DataFrame(df.to_json())属于无效写法,to_json本身就可以直接写文件,不需要额外嵌套一层DataFrame。
修正后代码
import os import pandas as pd excluded_sheet = ['Sheet 2','Sheet 6'] for xls_path in file_paths: # 初始化列表,暂存当前Excel下所有目标工作表的数据 df_collector = [] data_file = pd.ExcelFile(xls_path) # 过滤掉需要排除的工作表 target_sheets = [sheet for sheet in data_file.sheet_names if sheet not in excluded_sheet] for sheet_name in target_sheets: # 读取单个工作表 single_sheet_df = pd.read_excel(xls_path, sheet_name=sheet_name, header=None) # 插入工作表名称列 single_sheet_df.insert(loc=0, column='sheet name', value=sheet_name) # 将当前工作表数据加入收集列表 df_collector.append(single_sheet_df) # 当前文件所有工作表读取完成后,一次性合并全量数据 merged_df = pd.concat(df_collector, ignore_index=True) # 安全处理输出文件名,兼容不同操作系统路径格式 base_file_name = os.path.splitext(os.path.basename(xls_path))[0] output_path = os.path.join(json_folder_path, f"{base_file_name}.json") # 导出为单个JSON文件,每个Excel仅写入一次,不会被覆盖 merged_df.to_json(output_path, orient='records', indent=4)
关键调整说明
- 明确拆分循环层级:外层循环对应单个Excel文件,内层循环仅负责读取单个工作表、收集数据,不执行任何写入操作
- 每个Excel文件单独维护一个收集列表,存储所有符合要求的工作表DataFrame,所有表读取完成后只执行一次
concat做全量合并 - JSON写入操作移到内层工作表循环外部,每个Excel文件仅执行一次写入,彻底解决循环覆盖问题
- 替换了原代码中容易出错的手动路径切片逻辑,用os模块内置方法处理文件名和路径,避免跨平台运行报错
- 完全保留你需要的「将工作表名作为列写入数据」的需求,不需要使用
sheet_name=None参数 - 去掉了原代码中无效的DataFrame嵌套写法,减少不必要的性能开销。
内容的提问来源于stack exchange,提问作者Adbul
相关产品推荐
相关产品推荐

