我是Python新手。我正在编写一个简单的 Flask 应用程序。当我尝试从 SQL Alchemy 查询结果生成 Excel 报告时遇到问题。我得到的错误是:
TypeError:值必须是列表、元组、范围或生成器,或者字典。提供的值为
你能帮忙吗?谢谢
from openpyxl import Workbook
from flask import Response
from app.models import DataModelTbl #inherits from DB.Model
wb = Workbook()
ws = wb.active
# this returns the Flask SQLAlchemy database results
ResultSet = DataModelTbl.query.all()
rows = [u.__dict__ for u in ResultSet]
# Add headers to the Excel sheet
headers = rows[0].keys()
# I get the error here ->
# TypeError: Value must be a list, tuple, range or generator, or a dict.
# Supplied value is <class 'dict_keys'>
ws.append(headers)
# Add data to the Excel sheet
for row_data in rows:
ws.append(list(row_data.values()))
# Create a response object for the Excel file
open_xml = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
response = Response(content_type=open_xml)
response.headers['Content-Disposition'] = 'attachment; filename=data.xlsx'
# Save the Excel workbook to the response
wb.save(response)
return response
keys()
方法确实返回 dict_keys
对象,它不是列表,但可以轻松地使用 list(rows[0].keys())
转换为它。
仍然可能无法解决问题,因为所选对象有额外的属性,无法写入工作表。
要仅获取列及其值,可以检查模型并使用结果
Mapper
对象。
from sqlalchemy import inspect
mapper = inspect(DataModelTbl)
headers = [column.name for column in mapper.columns]
ws.append(headers)
for record in ResultSet:
ws.append([getattr(record, key) for key in headers])
如果您有列类型,则可能仍然存在一些问题,无法转换为Excel。