Files
Alien_Sniper/Config/excel_to_json.py
T
2026-07-14 11:44:07 +08:00

127 lines
5.3 KiB
Python

import pandas as pd
import os
import sys
import json
def excel_to_json(excel_file, json_file):
try:
# 使用第二行作为列名,从第四行开始读取数据(即跳过第一、二、三行)
df = pd.read_excel(excel_file, header=1, skiprows=lambda x: x == 2)
# 将DataFrame转换为JSON数组并保存
df.to_json(json_file, orient='records', lines=False) # 不使用 lines=True
print(f"Successfully converted {excel_file} to {json_file}")
except Exception as e:
print(f"Failed to convert {excel_file}: {e}")
def generate_ts_class(json_file, excel_file, class_name):
try:
with open(json_file, 'r', encoding='utf-8') as file:
data = json.load(file)
if not data: # 如果JSON数据为空,则不生成TS类
print(f"No data found in {json_file}, skipping TS class generation for {class_name}.")
return ""
# 获取Excel文件的属性类型信息(第三行)
type_df = pd.read_excel(excel_file, skiprows=1, nrows=1)
types = type_df.iloc[0].apply(lambda x: x.strip() if isinstance(x, str) else x).tolist()
# 获取第一个对象的键作为属性名(第二行)
properties = list(data[0].keys())
# 开始生成TypeScript类定义
ts_content = f'export class {class_name} {{\n'
for prop, t in zip(properties, types):
# 直接使用从Excel中读取的类型,假设类型名是合法的TypeScript类型
ts_content += f' {prop}: {t};\n'
ts_content += '}\n\n'
print(f"Successfully generated TypeScript class {class_name} from {json_file}")
return ts_content
except Exception as e:
print(f"Failed to generate TypeScript class from {json_file}: {e}")
return ""
if __name__ == "__main__":
if len(sys.argv) != 4:
print("Usage: python excel_to_json.py <input_folder> <output_folder> <output_ts_folder>")
else:
input_folder = sys.argv[1]
output_folder = sys.argv[2]
output_ts_folder = sys.argv[3]
# 去掉路径末尾的反斜杠(如果有)
input_folder = input_folder.rstrip("\\/")
output_folder = output_folder.rstrip("\\/")
output_ts_folder = output_ts_folder.rstrip("\\/")
# 打印调试信息
print(f"Input folder: {input_folder}")
print(f"Output folder: {output_folder}")
print(f"output_ts_folder: {output_ts_folder}")
# 确保输入文件夹是一个目录
if not os.path.isdir(input_folder):
print(f"Error: {input_folder} is not a directory.")
sys.exit(1)
# 确保输出文件夹存在
if not os.path.exists(output_folder):
try:
os.makedirs(output_folder)
print(f"Created output folder: {output_folder}")
except Exception as e:
print(f"Failed to create output folder {output_folder}: {e}")
sys.exit(1)
# 初始化ConfigData.ts的内容
config_data_ts_content = """// This file is auto-generated. Do not modify manually.
import { js } from "cc";
"""
# 存储类名和对应类定义的映射
class_definitions = []
# 遍历输入文件夹中的所有xlsx文件
for filename in os.listdir(input_folder):
if filename.lower().endswith(".xlsx"): # 忽略大小写
input_excel = os.path.join(input_folder, filename)
base_name = os.path.splitext(filename)[0]
# 直接使用文件名作为类名,而不是首字母大写其余小写
class_name = base_name
output_json = os.path.join(output_folder, f"{base_name}.json")
print(f"Processing {input_excel} -> {output_json}")
# 转换Excel到JSON
excel_to_json(input_excel, output_json)
# 生成TypeScript类定义并添加到ConfigData.ts内容中
ts_class_content = generate_ts_class(output_json, input_excel, class_name)
if ts_class_content:
class_definitions.append((class_name, ts_class_content))
# 将所有类定义追加到ConfigData.ts内容中
for class_name, ts_class_content in class_definitions:
config_data_ts_content += ts_class_content
# 添加 setClassName 函数
config_data_ts_content += "\nexport function setClassName() {\n"
for class_name, _ in class_definitions:
config_data_ts_content += f' js.setClassName("{class_name}", {class_name});\n'
config_data_ts_content += "}\n\n"
# 在ConfigData.ts文件末尾添加全局变量声明部分
config_data_ts_content += "\n(window as any).ConfigData = (window as any).ConfigData || {};\n"
for class_name, _ in class_definitions:
config_data_ts_content += f"(window as any).ConfigData['{class_name}'] = {class_name};\n"
# 写入到ConfigData.ts文件
config_data_ts_file = os.path.join(output_ts_folder, "ConfigData.ts")
with open(config_data_ts_file, 'w', encoding='utf-8') as ts:
ts.write(config_data_ts_content)
print(f"Successfully generated ConfigData.ts at {config_data_ts_file}")