127 lines
5.3 KiB
Python
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}") |