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 ") 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}")