如何用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)
代码关键逻辑解释
合并单元格解析:
用openpyxl遍历所有合并单元格,分别记录顶级表头(Test、Timings)对应的列范围,以及Test下的Social Media对应的列范围,这样我们就能准确区分不同模块的列数据。数据读取:
用pd.read_excel(header=2)指定Excel第3行作为DataFrame的表头,这样数据行就直接对应你需要的Posts、09:00这些内容,不需要额外跳过行。结构构建:
针对每个模块(Social Media、Timings),用iloc切片提取对应列的数据,然后将第一行数据转为字典并包装成列表,完全匹配你想要的JSON层级结构。扩展说明:
如果你的Excel有多个数据行(比如不止一行Posts/Shorts),只需要把iloc[0]改成遍历所有行即可,比如:# 遍历所有数据行生成字典列表 social_media_list = [row.to_dict() for _, row in social_media_data.iterrows()]
运行这段代码后,就能得到你给出的目标JSON格式啦!
备注:内容来源于stack exchange,提问作者idp whatuni
相关产品推荐
相关产品推荐

