yearData.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. from decimal import Decimal, InvalidOperation
  2. import xlrd
  3. import pymysql
  4. from datetime import datetime
  5. # 数据库配置(需根据实际情况修改)
  6. DB_CONFIG = {
  7. 'host': '10.130.75.149',
  8. 'port': 3307,
  9. 'user': 'yto_crm',
  10. 'password': '%3sFUlsolaRI',
  11. 'database': 'crm_uat',
  12. 'charset': 'utf8mb4'
  13. }
  14. def convert_unit(value):
  15. """亿元转万元,处理空值"""
  16. try:
  17. # 如果 value 不是特殊的无效值,进行转换并保留4位小数
  18. return round(Decimal(value) * 10000, 4) if value not in ['-', ''] else None
  19. except (InvalidOperation, ValueError):
  20. # 捕获异常,返回 None
  21. return None
  22. def parse_ratio(value):
  23. """处理百分比数据"""
  24. return value if value not in ['-', ''] else None
  25. def get_upsert_sql():
  26. """生成带更新条件的SQL语句"""
  27. return """
  28. INSERT INTO t_yujin_crossborder_yearly_summary
  29. (year, year_total, year_import, year_export, trade_balance,
  30. yoy_import_export, yoy_import, yoy_export, create_time)
  31. VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)
  32. ON DUPLICATE KEY UPDATE
  33. year_total = VALUES(year_total),
  34. year_import = VALUES(year_import),
  35. year_export = VALUES(year_export),
  36. trade_balance = VALUES(trade_balance),
  37. yoy_import_export = VALUES(yoy_import_export),
  38. yoy_import = VALUES(yoy_import),
  39. yoy_export = VALUES(yoy_export),
  40. create_time = VALUES(create_time)
  41. """
  42. def main():
  43. # 连接数据库
  44. try:
  45. conn = pymysql.connect(**DB_CONFIG)
  46. cursor = conn.cursor()
  47. except pymysql.Error as e:
  48. print(f"数据库连接失败: {e}")
  49. return
  50. # 读取Excel文件
  51. try:
  52. workbook = xlrd.open_workbook('../src/downloads/20250513/(1)2025年进出口商品总值表_A年度表_3月.xls')
  53. sheet = workbook.sheet_by_index(0)
  54. except Exception as e:
  55. print(f"文件读取失败: {e}")
  56. conn.close()
  57. return
  58. sql = get_upsert_sql()
  59. current_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
  60. processed = 0
  61. for row_idx in range(5, sheet.nrows):
  62. row = sheet.row_values(row_idx)
  63. if not row[1]: # 跳过空年份
  64. continue
  65. # 准备数据
  66. params = (
  67. row[1], # year
  68. convert_unit(row[2]), # year_total
  69. convert_unit(row[4]), # year_import
  70. convert_unit(row[3]), # year_export
  71. convert_unit(row[5]), # trade_balance
  72. parse_ratio(row[6]), # yoy_import_export
  73. parse_ratio(row[7]), # yoy_import
  74. parse_ratio(row[8]), # yoy_export
  75. current_time # create_time
  76. )
  77. # 执行数据库操作
  78. try:
  79. cursor.execute(sql, params)
  80. processed += 1
  81. except pymysql.Error as e:
  82. print(f"数据插入失败(行{row_idx}): {e}")
  83. conn.rollback()
  84. break
  85. try:
  86. conn.commit()
  87. print(f"成功处理 {processed} 条数据,当前时间:{current_time}")
  88. except pymysql.Error as e:
  89. print(f"事务提交失败: {e}")
  90. finally:
  91. cursor.close()
  92. conn.close()
  93. if __name__ == "__main__":
  94. main()