test_excel_parse.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. import pandas as pd
  4. import json
  5. from pathlib import Path
  6. def test_excel_parsing():
  7. """测试Excel文件解析"""
  8. excel_path = "敌人配置表.xlsx"
  9. sheet_name = "敌人基础配置"
  10. print(f"正在读取Excel文件: {excel_path}")
  11. try:
  12. # 读取Excel文件
  13. df = pd.read_excel(excel_path, sheet_name=sheet_name)
  14. print(f"成功读取Excel文件,共{len(df)}行,{len(df.columns)}列")
  15. # 打印列名
  16. print(f"列名: {list(df.columns)}")
  17. # 打印前几行数据
  18. print("\n前5行数据:")
  19. for i in range(min(5, len(df))):
  20. print(f"第{i}行: {df.iloc[i].to_dict()}")
  21. # 模拟配置解析逻辑
  22. param_types = {
  23. '敌人ID': str,
  24. '敌人名称': str,
  25. '敌人类型': str,
  26. '稀有度': str,
  27. '权重': int,
  28. '生命值': int,
  29. '移动速度': int,
  30. '攻击力': int,
  31. '攻击范围': int,
  32. '攻击速度': float,
  33. '防御力': int,
  34. '金币奖励': int
  35. }
  36. # 检查第1行是否为描述行
  37. data_start_row = 1
  38. if len(df) > 1:
  39. first_cell = str(df.iloc[1, 0]).strip()
  40. print(f"第1行第一个单元格: '{first_cell}'")
  41. # 如果第1行第一个单元格是描述性文字,则从第2行开始
  42. if first_cell in ['唯一标识符', '描述', 'description', 'desc']:
  43. data_start_row = 2
  44. print("检测到描述行,跳过第1行")
  45. else:
  46. data_start_row = 1
  47. print("第1行是数据行,从第1行开始")
  48. print(f"\n数据起始行: {data_start_row}")
  49. # 解析多行数据
  50. config_list = []
  51. for i in range(data_start_row, len(df)):
  52. row_config = {}
  53. print(f"\n处理第{i}行数据:")
  54. for col_idx, col_name in enumerate(df.columns):
  55. param_name = str(col_name).strip()
  56. print(f" 列{col_idx}: {param_name}")
  57. if param_name in param_types:
  58. try:
  59. param_value = df.iloc[i, col_idx]
  60. print(f" 原始值: {param_value} (类型: {type(param_value)})")
  61. if pd.isna(param_value):
  62. print(f" 跳过空值")
  63. continue
  64. param_type = param_types[param_name]
  65. if param_type == bool:
  66. row_config[param_name] = str(param_value).lower() in ['true', '1', 'yes', 'on']
  67. else:
  68. row_config[param_name] = param_type(param_value)
  69. print(f" 转换后: {row_config[param_name]}")
  70. except (ValueError, TypeError, IndexError) as e:
  71. print(f" 转换失败: {e}")
  72. continue
  73. else:
  74. print(f" 参数名不在类型映射中")
  75. if row_config: # 只添加非空配置
  76. config_list.append(row_config)
  77. print(f" 添加配置: {row_config}")
  78. else:
  79. print(f" 跳过空配置")
  80. print(f"\n最终解析结果: 共{len(config_list)}个配置项")
  81. for i, config in enumerate(config_list):
  82. print(f"配置{i}: {config}")
  83. # 转换为敌人数据格式
  84. print("\n转换为敌人数据格式:")
  85. enemies = []
  86. for item in config_list:
  87. enemy_data = {
  88. 'id': item.get('敌人ID', ''),
  89. 'name': item.get('敌人名称', ''),
  90. 'type': item.get('敌人类型', ''),
  91. 'rarity': item.get('稀有度', ''),
  92. 'weight': item.get('权重', 1),
  93. 'health': item.get('生命值', 100),
  94. 'speed': item.get('移动速度', 50),
  95. 'attack': item.get('攻击力', 10),
  96. 'range': item.get('攻击范围', 100),
  97. 'attackSpeed': item.get('攻击速度', 1.0),
  98. 'defense': item.get('防御力', 0),
  99. 'goldReward': item.get('金币奖励', 10)
  100. }
  101. enemies.append(enemy_data)
  102. print(f"敌人数据: {enemy_data}")
  103. except Exception as e:
  104. print(f"解析失败: {e}")
  105. import traceback
  106. traceback.print_exc()
  107. if __name__ == "__main__":
  108. test_excel_parsing()