如何将嵌套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:
- 区分数据类型:字典(键值对)、列表(多个子项)、普通值;
- 字典类型:遍历每个键值对,键按当前层级添加缩进后写入A列,值根据类型处理——如果是嵌套结构则递归处理,普通值直接写入B列;
- 列表类型:遍历每个子元素,对每个元素递归处理,保持层级关系;
- 用递归函数跟踪当前行号和层级,确保内容连续写入。
完整实现代码
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
相关产品推荐
相关产品推荐

