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

如何将嵌套YAML数据导入Excel并按层级格式化展示?

实现YAML嵌套数据层级化导入Excel

需求背景

现有YAML文件包含多层嵌套的家庭数据,当前代码仅能导入顶层键值对,且格式不符合层级展示要求,需要将所有嵌套数据按层级缩进的方式导入Excel,让每个层级的内容清晰区分。

原始YAML数据

Name: Tom
Surname: Smith
Status: Married
Childs:
- ChildName: Willy
  Age: 30
  Grandchild:
  - GrandchildName: John
    Age: 4
  - GrandchildName: Maria
    Age: 3
- ChildName: Arthur
  Age: 40
  Grandchild: N/A

现有代码问题

现有代码仅遍历顶层键值对,无法处理嵌套的列表和字典结构,且写入Excel时格式混乱:

import openpyxl
import yaml

with open('family.yaml') as file:
    family_list = yaml.load(file, Loader=yaml.FullLoader)

def create_workbook():
    wb = openpyxl.Workbook('family.xlsx')
    wb.save('family.xlsx')

def update_workbook():
    wb = openpyxl.load_workbook('family.xlsx')

    sh1 = wb.active

    for item in family_list.items():
        sh1.append(item)
    wb.save('family.xlsx')

create_workbook()
update_workbook()

实现思路

核心是递归遍历YAML的嵌套结构,根据层级给键添加缩进,逐行写入Excel:

  1. 区分数据类型:字典(键值对)、列表(多个子项)、普通值;
  2. 字典类型:遍历每个键值对,键按当前层级添加缩进后写入A列,值根据类型处理——如果是嵌套结构则递归处理,普通值直接写入B列;
  3. 列表类型:遍历每个子元素,对每个元素递归处理,保持层级关系;
  4. 用递归函数跟踪当前行号和层级,确保内容连续写入。

完整实现代码

import openpyxl
import yaml

def load_yaml(file_path):
    with open(file_path, 'r', encoding='utf-8') as file:
        return yaml.load(file, Loader=yaml.FullLoader)

def write_data_to_sheet(sheet, data, level=0, start_row=1):
    current_row = start_row
    indent = '  ' * level  # 每个层级用2个空格缩进
    
    if isinstance(data, dict):
        for key, value in data.items():
            # 写入带缩进的键到A列
            sheet.cell(row=current_row, column=1, value=f"{indent}{key}")
            if isinstance(value, (dict, list)):
                # 嵌套结构留空B列,递归处理子内容
                sheet.cell(row=current_row, column=2, value='')
                current_row = write_data_to_sheet(sheet, value, level+1, current_row+1)
            else:
                # 普通值直接写入B列
                sheet.cell(row=current_row, column=2, value=value)
                current_row += 1
    elif isinstance(data, list):
        for item in data:
            # 遍历列表中的每个子项,递归写入
            current_row = write_data_to_sheet(sheet, item, level, current_row)
    return current_row

def main():
    family_data = load_yaml('family.yaml')
    wb = openpyxl.Workbook()
    sheet = wb.active
    write_data_to_sheet(sheet, family_data)
    wb.save('family.xlsx')

if __name__ == "__main__":
    main()

效果说明

运行代码后,Excel会按层级缩进展示所有数据:

  • 顶层数据(Name、Surname等)无缩进,占单独行;
  • Childs下的每个子项(Willy、Arthur)缩进2个空格;
  • Grandchild下的孙辈数据再缩进2个空格,层级关系清晰,完全符合需求。

内容的提问来源于stack exchange,提问作者user19263504

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 17:24:27