main
HuangHai 4 months ago
parent ae86048959
commit 26ae208519

@ -15,6 +15,14 @@ SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
# 创建 Base 类
Base = declarative_base()
# 获取数据库会话
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
# 定义 t_bi_question 表模型
class TBIQuestion(Base):
__tablename__ = "t_bi_question"

@ -1,6 +1,4 @@
import io
import pandas as pd
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Alignment, Border, Side
from openpyxl.utils import get_column_letter
@ -66,75 +64,3 @@ def save_to_excel(data, filename):
column_letter = get_column_letter(idx + 1)
worksheet.column_dimensions[column_letter].width = column_width
def save_to_excel_stream(data):
"""
将数据集保存为格式化的Excel文件流
参数
data - 数据集 (列表字典格式例如[{"列1": "值1", "列2": "值2"}, ...])
返回
BytesIO - 包含Excel文件内容的流
"""
# 转换数据为DataFrame
df = pd.DataFrame(data)
# 创建一个 BytesIO 对象作为缓冲区
output = io.BytesIO()
# 创建Excel工作簿
wb = Workbook()
ws = wb.active
ws.title = '统计报表'
# 写入数据
for row in pd.DataFrame(data).itertuples(index=False):
ws.append(row)
# 定义边框样式
thin_border = Border(left=Side(style='thin'),
right=Side(style='thin'),
top=Side(style='thin'),
bottom=Side(style='thin'))
# 设置全局行高
for row in ws.iter_rows():
ws.row_dimensions[row[0].row].height = 20
# 为所有单元格添加边框
for cell in row:
cell.border = thin_border
# 设置标题样式
header_font = Font(bold=True, size=14)
header_fill = PatternFill(start_color='ADD8E6', end_color='ADD8E6', fill_type='solid')
for cell in ws[1]:
cell.font = header_font
cell.fill = header_fill
cell.alignment = Alignment(horizontal='center', vertical='center')
# 设置数据行样式
data_font = Font(size=14)
for row in ws.iter_rows(min_row=2):
for cell in row:
cell.font = data_font
cell.alignment = Alignment(vertical='center', wrap_text=True)
# 动态设置列宽
for idx, column in enumerate(df.columns):
# 获取列的最大长度
max_length = max(
df[column].astype(str).map(len).max(), # 数据列的最大长度
len(str(column)) # 列名的长度
)
# 计算列宽,确保在 10 到 120 之间
column_width = min(max(max_length + 2, 10) * 2, 120) # 加 2 是为了留出一些空白
# 设置列宽
column_letter = get_column_letter(idx + 1)
ws.column_dimensions[column_letter].width = column_width
# 将工作簿保存到 BytesIO 对象
wb.save(output)
output.seek(0) # 将指针移动到流的开头
return output

@ -15,7 +15,7 @@ class VannaUtil(VannaBase):
self.training_data = []
self.chat_history = []
self.db_type = db_type
self.db_uri = db_uri or 'vanna.db' # 默认使用 SQLite
self.db_uri = db_uri or 'Db/vanna.db' # 默认使用 SQLite
self._init_db()
def _init_db(self):

@ -1,29 +1,24 @@
import re
import uuid
import uvicorn # 导入 uvicorn
from fastapi import FastAPI, HTTPException, Depends
from fastapi import FastAPI, HTTPException, Depends, Form
from sqlalchemy.orm import Session
from starlette.responses import StreamingResponse
from starlette.responses import JSONResponse
from starlette.staticfiles import StaticFiles
from Model.biModel import *
from Text2Sql.Util.PostgreSQLUtil import PostgreSQLUtil
from Text2Sql.Util.SaveToExcel import save_to_excel_stream
from Text2Sql.Util.SaveToExcel import save_to_excel
from Text2Sql.Util.VannaUtil import VannaUtil
from Model.biModel import *
# 初始化 FastAPI
app = FastAPI()
# 配置静态文件目录
app.mount("/static", StaticFiles(directory="static"), name="static")
@app.get("/")
def read_root():
return {"message": "Hello, World!"}
# 获取数据库会话
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
return {"message": "Welcome to Vanna AI SQL !"}
# 创建记录
@ -71,8 +66,11 @@ def delete_question(question_id: int, db: Session = Depends(get_db)):
# 通过语义生成Excel
# http://10.10.21.20:8000/questions/get_excel
# 参数question
@app.post("/questions/get_excel")
def get_excel(question: str):
def get_excel(question: str = Form(...)):
vn = VannaUtil()
# 指定学段
# question = '''
# 查询:
@ -92,18 +90,16 @@ def get_excel(question: str):
# 执行SQL查询
with PostgreSQLUtil() as db:
_data = db.execute_query(sql)
# 将数据保存为Excel文件流
excel_stream = save_to_excel_stream(_data)
# 返回Excel文件流
return StreamingResponse(
excel_stream,
media_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
headers={"Content-Disposition": "attachment; filename=导出信息.xlsx"}
)
print(_data)
# 在static目录下生成一个guid号的临时文件
uuidStr = str(uuid.uuid4())
filename = f"static/{uuidStr}.xlsx"
save_to_excel(_data, filename)
# 返回静态文件URL
return {"success": True, "message": "Excel文件生成成功", "download_url": f"/static/{uuidStr}.xlsx"}
# 确保直接运行脚本时启动 FastAPI 应用
if __name__ == "__main__":
vn = VannaUtil()
uvicorn.run("app:app", host="0.0.0.0", port=8000, reload=True)

Loading…
Cancel
Save