Versão em produção - código extraído do container
This commit is contained in:
32
routes/export.py
Executable file
32
routes/export.py
Executable file
@@ -0,0 +1,32 @@
|
||||
from fastapi import APIRouter
|
||||
from fastapi.responses import StreamingResponse
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
from sqlalchemy.future import select
|
||||
from models import Fatura
|
||||
from database import AsyncSessionLocal
|
||||
import pandas as pd
|
||||
from io import BytesIO
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
@router.get("/export-excel")
|
||||
async def exportar_excel():
|
||||
async with AsyncSessionLocal() as session:
|
||||
result = await session.execute(select(Fatura))
|
||||
faturas = result.scalars().all()
|
||||
|
||||
# Converte os objetos para lista de dicionários
|
||||
data = [f.__dict__ for f in faturas]
|
||||
for row in data:
|
||||
row.pop('_sa_instance_state', None) # remove campo interno do SQLAlchemy
|
||||
|
||||
df = pd.DataFrame(data)
|
||||
|
||||
# Converte para Excel em memória
|
||||
buffer = BytesIO()
|
||||
with pd.ExcelWriter(buffer, engine='xlsxwriter') as writer:
|
||||
df.to_excel(writer, index=False, sheet_name='Faturas')
|
||||
|
||||
buffer.seek(0)
|
||||
return StreamingResponse(buffer, media_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
|
||||
headers={"Content-Disposition": "attachment; filename=faturas.xlsx"})
|
||||
Reference in New Issue
Block a user