init
This commit is contained in:
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,32 @@
|
||||
@echo off
|
||||
set PYTHON_SCRIPT=excel_to_json.py
|
||||
set INPUT_FOLDER=%~dp0.
|
||||
set OUTPUT_FOLDER=../assets/resources/data
|
||||
set OUTPUT_TS_FOLDER=../assets/scripts/data
|
||||
|
||||
REM 打印调试信息
|
||||
echo Input folder: %INPUT_FOLDER%
|
||||
echo Output folder: %OUTPUT_FOLDER%
|
||||
|
||||
REM 确保输出文件夹存在
|
||||
if not exist "%OUTPUT_FOLDER%" (
|
||||
mkdir "%OUTPUT_FOLDER%"
|
||||
)
|
||||
|
||||
REM 检查输入文件夹是否存在
|
||||
if not exist "%INPUT_FOLDER%" (
|
||||
echo Input folder does not exist: %INPUT_FOLDER%
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
REM 执行Python脚本
|
||||
python %PYTHON_SCRIPT% "%INPUT_FOLDER%" "%OUTPUT_FOLDER%" "%OUTPUT_TS_FOLDER%"
|
||||
|
||||
if %errorlevel% equ 0 (
|
||||
echo All Excel files converted successfully!
|
||||
) else (
|
||||
echo Conversion failed.
|
||||
)
|
||||
|
||||
|
||||
pause
|
||||
@@ -0,0 +1,127 @@
|
||||
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}")
|
||||
@@ -0,0 +1 @@
|
||||
<a href="https://www.lddgo.net/string/excel-to-json">点击跳转在线excel转json网站</a>
|
||||
@@ -0,0 +1,2 @@
|
||||
1.安装python
|
||||
2.pip install pandas openpyxl
|
||||
Reference in New Issue
Block a user