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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:50:06