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

Flask项目中SQLAlchemy查询结果转Excel遇TypeError求助

问题解决方法

报错原因

ws.append() 方法要求传入列表、元组、生成器或字典这类可迭代对象,但你传入的 rows[0].keys() 是dict_keys视图对象,不属于方法接受的类型,因此触发TypeError。

核心修复

直接把 headers 转换成列表即可,修改这一行代码:

headers = list(rows[0].keys())

额外优化建议

用 u.__dict__ 获取的字典会包含SQLAlchemy内部的 _sa_instance_state 无用字段,你可以过滤掉它,或者用更优雅的方式提取数据:

# 方式1:过滤内部字段
rows = [{k: v for k, v in u.__dict__.items() if k != '_sa_instance_state'} for u in ResultSet]

# 方式2:给模型类添加to_dict方法(更推荐)
# 在DataModelTbl类中新增:
# def to_dict(self):
#     return {c.name: getattr(self, c.name) for c in self.__table__.columns}
# 然后使用:
# rows = [u.to_dict() for u in ResultSet]

修正后的完整代码

from openpyxl import Workbook
from flask import Response
from app.models import DataModelTbl #inherits from DB.Model

wb = Workbook()
ws = wb.active

# 获取SQLAlchemy查询结果
ResultSet = DataModelTbl.query.all()

# 转换为字典并过滤无用字段
rows = [{k: v for k, v in u.__dict__.items() if k != '_sa_instance_state'} for u in ResultSet]

if rows:  # 避免空查询结果时rows[0]报错
    # 添加表头(转为列表)
    headers = list(rows[0].keys())
    ws.append(headers)  

    # 添加数据行
    for row_data in rows:
        ws.append(list(row_data.values()))

# 创建Excel响应对象
open_xml = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
response = Response(content_type=open_xml)
response.headers['Content-Disposition'] = 'attachment; filename=data.xlsx'

# 保存工作簿到响应
wb.save(response)

return response

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 16:07:18