save code
This commit is contained in:
@@ -0,0 +1,89 @@
|
||||
import pandas as pd
|
||||
from datetime import datetime
|
||||
from app.database.database import SessionLocal
|
||||
from app.models import Project, User
|
||||
|
||||
|
||||
def import_projects_from_excel():
|
||||
"""从Excel文件导入项目数据"""
|
||||
db = SessionLocal()
|
||||
|
||||
try:
|
||||
# 读取Excel文件
|
||||
excel_path = "/home/xsl/code/xsl_node/docs/example.xls"
|
||||
print(f"Reading Excel file: {excel_path}")
|
||||
|
||||
# 读取所有工作表
|
||||
xls = pd.ExcelFile(excel_path)
|
||||
print(f"Excel file has sheets: {xls.sheet_names}")
|
||||
|
||||
# 读取第一个工作表
|
||||
df = pd.read_excel(xls, sheet_name=0)
|
||||
print(f"Read {len(df)} rows from Excel")
|
||||
|
||||
# 获取marketing用户ID
|
||||
marketing_user = db.query(User).filter(User.username == "marketing").first()
|
||||
if not marketing_user:
|
||||
print("Marketing user not found. Exiting.")
|
||||
return
|
||||
|
||||
# 准备导入的项目数据
|
||||
projects_to_import = []
|
||||
skipped_rows = 0
|
||||
|
||||
for index, row in df.iterrows():
|
||||
try:
|
||||
# 创建项目对象
|
||||
project = Project(
|
||||
project_code=str(row.get('项目编号', f'PROJ{index+1}')),
|
||||
name=str(row.get('项目名称', f'项目{index+1}')),
|
||||
project_type=str(row.get('工程类别', '')),
|
||||
description=str(row.get('项目描述', '')),
|
||||
department=str(row.get('所属部门', '未知部门')),
|
||||
contract_amount=float(row.get('合同金额(万元)', 0)) if pd.notna(row.get('合同金额(万元)')) else 0,
|
||||
project_manager=str(row.get('项目负责人', '')),
|
||||
client_company=str(row.get('建设单位', '')),
|
||||
client_contact=str(row.get('建设单位联系人', '')),
|
||||
contract_date=pd.to_datetime(row.get('合同签订日期')).date() if pd.notna(row.get('合同签订日期')) else None,
|
||||
start_date=pd.to_datetime(row.get('开始日期')).date() if pd.notna(row.get('开始日期')) else None,
|
||||
planned_end_date=pd.to_datetime(row.get('计划结束日期')).date() if pd.notna(row.get('计划结束日期')) else None,
|
||||
actual_end_date=pd.to_datetime(row.get('实际结束日期')).date() if pd.notna(row.get('实际结束日期')) else None,
|
||||
progress=float(row.get('累计进度(%)', 0)) if pd.notna(row.get('累计进度(%)')) else 0,
|
||||
actual_received_amount=float(row.get('实际收款金额(万元)', 0)) if pd.notna(row.get('实际收款金额(万元)')) else 0,
|
||||
payment_completion_rate=float(row.get('回款完成率(%)', 0)) if pd.notna(row.get('回款完成率(%)')) else 0,
|
||||
payment_terms=str(row.get('付款方式', '')),
|
||||
status=str(row.get('状态', 'pending')),
|
||||
created_by=marketing_user.id
|
||||
)
|
||||
projects_to_import.append(project)
|
||||
|
||||
# 每100条记录打印一次进度
|
||||
if (index + 1) % 100 == 0:
|
||||
print(f"Processed {index + 1} rows...")
|
||||
|
||||
except Exception as e:
|
||||
print(f"Error processing row {index + 1}: {e}")
|
||||
skipped_rows += 1
|
||||
continue
|
||||
|
||||
# 批量导入数据
|
||||
if projects_to_import:
|
||||
print(f"Importing {len(projects_to_import)} projects to database...")
|
||||
db.add_all(projects_to_import)
|
||||
db.commit()
|
||||
print(f"Successfully imported {len(projects_to_import)} projects!")
|
||||
print(f"Skipped {skipped_rows} rows due to errors")
|
||||
else:
|
||||
print("No projects to import")
|
||||
|
||||
except Exception as e:
|
||||
db.rollback()
|
||||
print(f"Error importing projects: {e}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
finally:
|
||||
db.close()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
import_projects_from_excel()
|
||||
Reference in New Issue
Block a user