json_to_excel.py 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  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('chaseRange', 0),
  49. '旋转速度': movement.get('rotationSpeed', 0),
  50. })
  51. # 战斗配置
  52. combat = enemy.get('combat', {})
  53. row.update({
  54. '攻击伤害': combat.get('attackDamage', 0),
  55. '攻击范围': combat.get('attackRange', 0),
  56. '攻击速度': combat.get('attackSpeed', 0),
  57. '可以格挡': combat.get('canBlock', False),
  58. '格挡几率': combat.get('blockChance', 0),
  59. '格挡伤害减免': combat.get('blockDamageReduction', 0),
  60. '攻击冷却': combat.get('attackCooldown', 0),
  61. })
  62. # 视觉配置
  63. visual = enemy.get('visualConfig', {})
  64. row.update({
  65. '精灵路径': visual.get('spritePath', ''),
  66. '缩放': visual.get('scale', 1.0),
  67. '动画速度': visual.get('animationSpeed', 1.0),
  68. })
  69. # 音频配置
  70. audio = enemy.get('audioConfig', {})
  71. row.update({
  72. '攻击音效': audio.get('attackSound', ''),
  73. '死亡音效': audio.get('deathSound', ''),
  74. '受击音效': audio.get('hitSound', ''),
  75. })
  76. # 特殊配置
  77. stealth_config = enemy.get('stealthConfig', {})
  78. if stealth_config:
  79. row.update({
  80. '可隐身': stealth_config.get('canStealth', False),
  81. '隐身持续时间': stealth_config.get('stealthDuration', 0),
  82. '隐身冷却时间': stealth_config.get('stealthCooldown', 0),
  83. '隐身透明度': stealth_config.get('stealthAlpha', 1.0),
  84. })
  85. else:
  86. row.update({
  87. '可隐身': False,
  88. '隐身持续时间': 0,
  89. '隐身冷却时间': 0,
  90. '隐身透明度': 1.0,
  91. })
  92. # BOSS配置
  93. boss_config = enemy.get('bossConfig', {})
  94. if boss_config:
  95. row.update({
  96. '是否BOSS': boss_config.get('isBoss', False),
  97. 'BOSS阶段数': boss_config.get('phases', 1),
  98. '狂暴阈值': boss_config.get('enrageThreshold', 0),
  99. '狂暴伤害倍数': boss_config.get('enrageDamageMultiplier', 1.0),
  100. '狂暴速度倍数': boss_config.get('enrageSpeedMultiplier', 1.0),
  101. })
  102. else:
  103. row.update({
  104. '是否BOSS': False,
  105. 'BOSS阶段数': 1,
  106. '狂暴阈值': 0,
  107. '狂暴伤害倍数': 1.0,
  108. '狂暴速度倍数': 1.0,
  109. })
  110. # 特殊技能
  111. special_abilities = enemy.get('specialAbilities', [])
  112. abilities_text = ''
  113. if special_abilities:
  114. abilities_list = []
  115. for ability in special_abilities:
  116. ability_str = f"{ability.get('type', '')}(伤害:{ability.get('damage', 0)},范围:{ability.get('range', ability.get('radius', 0))},冷却:{ability.get('cooldown', 0)})"
  117. abilities_list.append(ability_str)
  118. abilities_text = '; '.join(abilities_list)
  119. row['特殊技能'] = abilities_text
  120. excel_data.append(row)
  121. return excel_data
  122. def save_to_excel(excel_data, output_path):
  123. """保存数据到Excel文件"""
  124. try:
  125. # 创建DataFrame
  126. df = pd.DataFrame(excel_data)
  127. # 创建Excel写入器
  128. with pd.ExcelWriter(output_path, engine='openpyxl') as writer:
  129. # 写入敌人基础配置工作表
  130. df.to_excel(writer, sheet_name='敌人基础配置', index=False)
  131. # 获取工作表对象进行格式化
  132. worksheet = writer.sheets['敌人基础配置']
  133. # 调整列宽
  134. for column in worksheet.columns:
  135. max_length = 0
  136. column_letter = column[0].column_letter
  137. for cell in column:
  138. try:
  139. if len(str(cell.value)) > max_length:
  140. max_length = len(str(cell.value))
  141. except:
  142. pass
  143. adjusted_width = min(max_length + 2, 50)
  144. worksheet.column_dimensions[column_letter].width = adjusted_width
  145. print(f"Excel文件已保存到: {output_path}")
  146. return True
  147. except Exception as e:
  148. print(f"保存Excel文件失败: {e}")
  149. return False
  150. def main():
  151. """主函数"""
  152. # 设置文件路径
  153. script_dir = Path(__file__).parent
  154. json_path = script_dir.parent / 'enemies.json'
  155. excel_path = script_dir / '敌人配置表.xlsx'
  156. print(f"JSON文件路径: {json_path}")
  157. print(f"Excel文件路径: {excel_path}")
  158. # 检查JSON文件是否存在
  159. if not json_path.exists():
  160. print(f"错误: JSON文件不存在: {json_path}")
  161. return False
  162. # 加载JSON数据
  163. print("正在加载JSON数据...")
  164. enemies_data = load_enemies_json(json_path)
  165. if not enemies_data:
  166. return False
  167. # 转换数据
  168. print("正在转换数据格式...")
  169. excel_data = convert_enemies_to_excel_data(enemies_data)
  170. print(f"成功转换 {len(excel_data)} 个敌人配置")
  171. # 保存到Excel
  172. print("正在保存Excel文件...")
  173. success = save_to_excel(excel_data, excel_path)
  174. if success:
  175. print("\n转换完成!")
  176. print(f"已将 {len(excel_data)} 个敌人配置保存到Excel文件")
  177. print(f"文件位置: {excel_path}")
  178. return True
  179. else:
  180. print("\n转换失败!")
  181. return False
  182. if __name__ == "__main__":
  183. main()