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
相关产品推荐
相关产品推荐

