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

如何用Python读取含合并单元格的Excel数据并转换为指定格式的JSON

如何用Python读取含合并单元格的Excel数据并转换为指定格式的JSON

看起来你已经找对了方向——用openpyxl处理合并单元格,用pandas处理数据,现在只需要把这两部分的逻辑结合起来,就能生成你想要的JSON结构啦。我来一步步帮你调整代码,实现目标效果:

完整解决方案代码

import pandas as pd
from openpyxl import load_workbook
import json

filepath = r'filename.xlsx'

# 1. 用openpyxl解析合并单元格,理清表头层级与对应列范围
wb = load_workbook(filename=filepath, data_only=False)
ws = wb['Sheet1']

merged_col_ranges = {}
social_media_cols = None

# 遍历所有合并单元格,提取层级与列范围
for merged_cell in ws.merged_cells.ranges:
    # 处理第一行的顶级合并单元格(Test、Timings)
    if merged_cell.min_row == 1:
        cell_val = ws.cell(row=1, column=merged_cell.min_col).value
        merged_col_ranges[cell_val] = (merged_cell.min_col, merged_cell.max_col)
    # 处理第二行的Social Media合并单元格
    elif merged_cell.min_row == 2:
        social_media_cols = (merged_cell.min_col, merged_cell.max_col)

# 2. 用pandas读取数据,指定第3行为表头,获取数据行
# header=2 对应Excel的第3行(pandas索引从0开始)
df = pd.read_excel(filepath, header=2)

# 3. 构建目标JSON对应的字典结构
result = {}

# 处理Test -> Social Media模块
test_section = {}
# 提取Social Media对应的列(注意openpyxl是1索引,pandas是0索引,要减1)
social_media_data = df.iloc[:, social_media_cols[0]-1 : social_media_cols[1]]
# 将第一行数据转为字典,包装成列表
test_section["Social Media"] = [social_media_data.iloc[0].to_dict()]
result["Test"] = test_section

# 处理Timings模块
timings_cols = merged_col_ranges["Timings"]
timings_data = df.iloc[:, timings_cols[0]-1 : timings_cols[1]]
result["Timings"] = [timings_data.iloc[0].to_dict()]

# 4. 生成格式化的JSON输出
final_json = json.dumps(result, indent=2)
print(final_json)

代码关键逻辑解释

  1. 合并单元格解析:
    用openpyxl遍历所有合并单元格,分别记录顶级表头(Test、Timings)对应的列范围,以及Test下的Social Media对应的列范围,这样我们就能准确区分不同模块的列数据。

  2. 数据读取:
    用pd.read_excel(header=2)指定Excel第3行作为DataFrame的表头,这样数据行就直接对应你需要的Posts、09:00这些内容,不需要额外跳过行。

  3. 结构构建:
    针对每个模块(Social Media、Timings),用iloc切片提取对应列的数据,然后将第一行数据转为字典并包装成列表,完全匹配你想要的JSON层级结构。

  4. 扩展说明:
    如果你的Excel有多个数据行(比如不止一行Posts/Shorts),只需要把iloc[0]改成遍历所有行即可,比如:

    # 遍历所有数据行生成字典列表
    social_media_list = [row.to_dict() for _, row in social_media_data.iterrows()]
    

运行这段代码后,就能得到你给出的目标JSON格式啦!

备注:内容来源于stack exchange,提问作者idp whatuni

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 14:49:35