使用requests请求数据库并通过openpyxl导出Excel遇嵌套结构问题
我明白你遇到的问题了——当接口返回的数据包含列表或者嵌套字典时,直接把值写到Excel第二行就会出问题,因为这些复杂类型没法直接作为单元格值写入。下面给你两套适配不同需求的解决方案,完美解决这个场景:
解决方案:处理嵌套数据并写入Excel
方案1:扁平化嵌套结构(推荐用于需要拆分查看子字段的场景)
这种方式会把嵌套字典的键转为父键.子键格式,列表转为键[索引]格式,让所有子字段都单独成为Excel的一列,方便后续查看和分析。
步骤1:编写递归扁平化函数
def flatten_data(data, parent_key='', sep='.'): items = [] if isinstance(data, dict): for k, v in data.items(): new_key = f"{parent_key}{sep}{k}" if parent_key else k items.extend(flatten_data(v, new_key, sep=sep)) elif isinstance(data, list): for i, v in enumerate(data): new_key = f"{parent_key}[{i}]" if parent_key else f"[{i}]" items.extend(flatten_data(v, new_key, sep=sep)) else: items.append((parent_key, data)) return dict(items)
步骤2:结合requests和openpyxl完整实现
import requests from openpyxl import Workbook # 替换成你的实际请求逻辑 response = requests.get("你的数据库查询接口地址") # 模拟接口返回的复杂数据(可删除,用上面的response.json()替代) mock_response = { "user_id": 1001, "profile": { "name": "Mr_Happy", "age": 30 }, "permissions": ["read", "write", "manage"], "last_active": "2024-05-20" } raw_data = mock_response # 实际场景改为response.json() # 扁平化处理数据 flattened_data = flatten_data(raw_data) # 写入Excel wb = Workbook() ws = wb.active # 第1行写键 ws.append(list(flattened_data.keys())) # 第2行写对应的值 ws.append(list(flattened_data.values())) wb.save("query_result.xlsx")
方案2:保留原始结构(推荐用于需要后续解析数据的场景)
如果不想拆分嵌套结构,而是希望把列表/字典作为一个单元格内容保存,可以直接将复杂类型转为JSON字符串,后续需要时再解析还原。
import requests import json from openpyxl import Workbook # 同样替换成你的实际请求逻辑 response = requests.get("你的数据库查询接口地址") raw_data = response.json() # 处理复杂类型:转为JSON字符串 processed_data = {} for key, value in raw_data.items(): if isinstance(value, (dict, list)): processed_data[key] = json.dumps(value, ensure_ascii=False) else: processed_data[key] = value # 写入Excel wb = Workbook() ws = wb.active ws.append(list(processed_data.keys())) ws.append(list(processed_data.values())) wb.save("query_result_raw.xlsx")
关键说明
- 扁平化方案适合需要单独查看每个子字段的场景,比如要对
profile.age做统计分析。 - JSON字符串方案适合需要保留原始数据结构的场景,后续可以用
json.loads()重新解析成字典/列表。
内容的提问来源于stack exchange,提问作者Mr_Happy
相关产品推荐
相关产品推荐

