我的 Flask 项目中的 SQL Alchemy 结果到 Excel 的转换

问题描述 投票:0回答:1

我是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
python flask flask-sqlalchemy
1个回答
0
投票

Dictionary 的

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。

© www.soinside.com 2019 - 2024. All rights reserved.