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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 11:03:24