simple_import.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. """
  4. 简单的教职工数据导入脚本
  5. """
  6. import os
  7. import pandas as pd
  8. from sqlalchemy import create_engine, text
  9. # 数据库配置
  10. DB_CONFIG = {
  11. "host": "47.99.164.66",
  12. "port": 3306,
  13. "database": "hzdyjs_xg",
  14. "user": "root",
  15. "password": "nsyOfyOyoFCr%Brj-k_5PqbW",
  16. "charset": "utf8mb4"
  17. }
  18. def main():
  19. # 构建数据库连接
  20. user = DB_CONFIG.get("user")
  21. password = DB_CONFIG.get("password")
  22. host = DB_CONFIG.get("host", "localhost")
  23. port = DB_CONFIG.get("port", 3306)
  24. database = DB_CONFIG.get("database")
  25. charset = DB_CONFIG.get("charset", "utf8mb4")
  26. uri = f"mysql+pymysql://{user}:{password}@{host}:{port}/{database}?charset={charset}"
  27. engine = create_engine(uri, pool_pre_ping=True)
  28. # Excel文件路径
  29. excel_file = "人员清单列表1@正式员工.xlsx"
  30. table_name = "temp_staff_data"
  31. if not os.path.exists(excel_file):
  32. print(f"找不到文件: {excel_file}")
  33. return
  34. print(f"读取Excel文件: {excel_file}")
  35. # 读取Excel文件
  36. df = pd.read_excel(excel_file, engine='openpyxl')
  37. print(f"读取到 {len(df)} 行数据")
  38. print(f"列名: {list(df.columns)}")
  39. # 清理列名
  40. df.columns = [col.replace('(', '_').replace(')', '_').replace('、', '_').replace(' ', '_') for col in df.columns]
  41. print(f"清理后的列名: {list(df.columns)}")
  42. # 创建临时表
  43. print(f"创建临时表: {table_name}")
  44. # 先删除已存在的表
  45. with engine.begin() as conn:
  46. conn.execute(text(f"DROP TABLE IF EXISTS `{table_name}`"))
  47. # 根据实际列名创建表结构
  48. create_sql = f"CREATE TABLE `{table_name}` (\n"
  49. create_sql += " `id` BIGINT(20) NOT NULL AUTO_INCREMENT,\n"
  50. for col in df.columns:
  51. # 清理列名,移除特殊字符
  52. clean_col = col.replace('(', '_').replace(')', '_').replace('、', '_').replace(' ', '_')
  53. create_sql += f" `{clean_col}` TEXT DEFAULT NULL,\n"
  54. create_sql += " `import_time` DATETIME DEFAULT CURRENT_TIMESTAMP,\n"
  55. create_sql += " PRIMARY KEY (`id`)\n"
  56. create_sql += ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;"
  57. print("创建表SQL:")
  58. print(create_sql)
  59. with engine.begin() as conn:
  60. conn.execute(text(create_sql))
  61. # 导入数据
  62. print("导入数据...")
  63. df.to_sql(name=table_name, con=engine, index=False, if_exists="append", chunksize=1000, method="multi")
  64. # 验证结果
  65. with engine.begin() as conn:
  66. result = conn.execute(text(f"SELECT COUNT(*) as count FROM {table_name}"))
  67. count = result.fetchone()[0]
  68. print(f"成功导入 {count} 条记录")
  69. # 显示前5行
  70. result = conn.execute(text(f"SELECT * FROM {table_name} LIMIT 5"))
  71. columns = result.keys()
  72. print(f"\n前5行数据预览:")
  73. print("-" * 80)
  74. print(f"{' | '.join(columns)}")
  75. print("-" * 80)
  76. for row in result:
  77. print(f"{' | '.join(str(cell) if cell is not None else '' for cell in row)}")
  78. print("\n导入完成!")
  79. if __name__ == "__main__":
  80. main()