json_to_excel.py 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. """
  4. 将JSON配置文件转换为Excel格式的工具
  5. 专门用于将enemies.json转换为敌人配置表.xlsx
  6. 作者: AI Assistant
  7. 日期: 2024
  8. """
  9. import json
  10. import pandas as pd
  11. from pathlib import Path
  12. import sys
  13. from datetime import datetime
  14. def load_enemies_json(json_path):
  15. """加载enemies.json文件"""
  16. try:
  17. with open(json_path, 'r', encoding='utf-8') as f:
  18. data = json.load(f)
  19. return data
  20. except Exception as e:
  21. print(f"加载JSON文件失败: {e}")
  22. return None
  23. def convert_enemies_to_excel_data(enemies_data):
  24. """将敌人JSON数据转换为Excel表格数据"""
  25. excel_data = []
  26. for enemy in enemies_data.get('enemies', []):
  27. # 基础信息
  28. row = {
  29. 'ID': enemy.get('id', ''),
  30. '敌人名称': enemy.get('name', ''),
  31. '敌人类型': enemy.get('type', ''),
  32. '稀有度': enemy.get('rarity', ''),
  33. }
  34. # 基础属性
  35. stats = enemy.get('stats', {})
  36. row.update({
  37. '生命值': stats.get('health', 0),
  38. '最大生命值': stats.get('maxHealth', 0),
  39. '防御力': stats.get('defense', 0),
  40. '移动速度': stats.get('speed', 0),
  41. })
  42. # 移动配置
  43. movement = enemy.get('movement', {})
  44. row.update({
  45. '移动模式': movement.get('pattern', ''),
  46. '移动速度值': movement.get('speed', 0),
  47. '巡逻范围': movement.get('patrolRange', 0),
  48. '旋转速度': movement.get('rotationSpeed', 0),
  49. })
  50. # 战斗配置
  51. combat = enemy.get('combat', {})
  52. row.update({
  53. '攻击伤害': combat.get('attackDamage', 0),
  54. '攻击范围': combat.get('attackRange', 0),
  55. '攻击速度': combat.get('attackSpeed', 0),
  56. '可以格挡': combat.get('canBlock', False),
  57. '格挡几率': combat.get('blockChance', 0),
  58. '格挡伤害减免': combat.get('blockDamageReduction', 0),
  59. '攻击冷却': combat.get('attackCooldown', 0),
  60. })
  61. # 视觉配置
  62. visual = enemy.get('visualConfig', {})
  63. row.update({
  64. '精灵路径': visual.get('spritePath', ''),
  65. '缩放': visual.get('scale', 1.0),
  66. '动画速度': visual.get('animationSpeed', 1.0),
  67. })
  68. # 音频配置
  69. audio = enemy.get('audioConfig', {})
  70. row.update({
  71. '攻击音效': audio.get('attackSound', ''),
  72. '死亡音效': audio.get('deathSound', ''),
  73. '受击音效': audio.get('hitSound', ''),
  74. })
  75. # 特殊配置
  76. stealth_config = enemy.get('stealthConfig', {})
  77. if stealth_config:
  78. row.update({
  79. '可隐身': stealth_config.get('canStealth', False),
  80. '隐身持续时间': stealth_config.get('stealthDuration', 0),
  81. '隐身冷却时间': stealth_config.get('stealthCooldown', 0),
  82. '隐身透明度': stealth_config.get('stealthAlpha', 1.0),
  83. })
  84. else:
  85. row.update({
  86. '可隐身': False,
  87. '隐身持续时间': 0,
  88. '隐身冷却时间': 0,
  89. '隐身透明度': 1.0,
  90. })
  91. # BOSS配置
  92. boss_config = enemy.get('bossConfig', {})
  93. if boss_config:
  94. row.update({
  95. '是否BOSS': boss_config.get('isBoss', False),
  96. 'BOSS阶段数': boss_config.get('phases', 1),
  97. '狂暴阈值': boss_config.get('enrageThreshold', 0),
  98. '狂暴伤害倍数': boss_config.get('enrageDamageMultiplier', 1.0),
  99. '狂暴速度倍数': boss_config.get('enrageSpeedMultiplier', 1.0),
  100. })
  101. else:
  102. row.update({
  103. '是否BOSS': False,
  104. 'BOSS阶段数': 1,
  105. '狂暴阈值': 0,
  106. '狂暴伤害倍数': 1.0,
  107. '狂暴速度倍数': 1.0,
  108. })
  109. # 特殊技能
  110. special_abilities = enemy.get('specialAbilities', [])
  111. abilities_text = ''
  112. if special_abilities:
  113. abilities_list = []
  114. for ability in special_abilities:
  115. ability_str = f"{ability.get('type', '')}(伤害:{ability.get('damage', 0)},范围:{ability.get('range', ability.get('radius', 0))},冷却:{ability.get('cooldown', 0)})"
  116. abilities_list.append(ability_str)
  117. abilities_text = '; '.join(abilities_list)
  118. row['特殊技能'] = abilities_text
  119. excel_data.append(row)
  120. return excel_data
  121. def save_to_excel(excel_data, output_path):
  122. """保存数据到Excel文件"""
  123. try:
  124. # 创建DataFrame
  125. df = pd.DataFrame(excel_data)
  126. # 创建Excel写入器
  127. with pd.ExcelWriter(output_path, engine='openpyxl') as writer:
  128. # 写入敌人基础配置工作表
  129. df.to_excel(writer, sheet_name='敌人基础配置', index=False)
  130. # 获取工作表对象进行格式化
  131. worksheet = writer.sheets['敌人基础配置']
  132. # 调整列宽
  133. for column in worksheet.columns:
  134. max_length = 0
  135. column_letter = column[0].column_letter
  136. for cell in column:
  137. try:
  138. if len(str(cell.value)) > max_length:
  139. max_length = len(str(cell.value))
  140. except:
  141. pass
  142. adjusted_width = min(max_length + 2, 50)
  143. worksheet.column_dimensions[column_letter].width = adjusted_width
  144. print(f"Excel文件已保存到: {output_path}")
  145. return True
  146. except Exception as e:
  147. print(f"保存Excel文件失败: {e}")
  148. return False
  149. def main():
  150. """主函数"""
  151. # 设置文件路径
  152. script_dir = Path(__file__).parent
  153. json_path = script_dir.parent / 'enemies.json'
  154. excel_path = script_dir / '敌人配置表.xlsx'
  155. print(f"JSON文件路径: {json_path}")
  156. print(f"Excel文件路径: {excel_path}")
  157. # 检查JSON文件是否存在
  158. if not json_path.exists():
  159. print(f"错误: JSON文件不存在: {json_path}")
  160. return False
  161. # 加载JSON数据
  162. print("正在加载JSON数据...")
  163. enemies_data = load_enemies_json(json_path)
  164. if not enemies_data:
  165. return False
  166. # 转换数据
  167. print("正在转换数据格式...")
  168. excel_data = convert_enemies_to_excel_data(enemies_data)
  169. print(f"成功转换 {len(excel_data)} 个敌人配置")
  170. # 保存到Excel
  171. print("正在保存Excel文件...")
  172. success = save_to_excel(excel_data, excel_path)
  173. if success:
  174. print("\n转换完成!")
  175. print(f"已将 {len(excel_data)} 个敌人配置保存到Excel文件")
  176. print(f"文件位置: {excel_path}")
  177. return True
  178. else:
  179. print("\n转换失败!")
  180. return False
  181. if __name__ == "__main__":
  182. main()