90 lines
3.2 KiB
Python
90 lines
3.2 KiB
Python
|
import os
|
|||
|
import json
|
|||
|
import openpyxl
|
|||
|
import re
|
|||
|
|
|||
|
excel_dir = 'excel'
|
|||
|
output_dir = 'src/ReplicatedStorage/Data'
|
|||
|
|
|||
|
if not os.path.exists(output_dir):
|
|||
|
os.makedirs(output_dir)
|
|||
|
|
|||
|
def parse_array_field(value, elem_type):
|
|||
|
"""
|
|||
|
解析数组类型字段,支持[1,2,3]或1,2,3写法,自动去除空格和空字符串。
|
|||
|
elem_type: 'int', 'float', 'string'等
|
|||
|
"""
|
|||
|
if value is None:
|
|||
|
return []
|
|||
|
s = str(value).strip()
|
|||
|
# 支持带中括号写法
|
|||
|
if s.startswith("[") and s.endswith("]"):
|
|||
|
s = s[1:-1]
|
|||
|
# 支持英文逗号和中文逗号
|
|||
|
items = re.split(r'[,,]', s)
|
|||
|
result = []
|
|||
|
for v in items:
|
|||
|
v = v.strip()
|
|||
|
if v == "":
|
|||
|
continue
|
|||
|
if elem_type == "int":
|
|||
|
try:
|
|||
|
result.append(int(v))
|
|||
|
except Exception:
|
|||
|
pass
|
|||
|
elif elem_type == "float":
|
|||
|
try:
|
|||
|
result.append(float(v))
|
|||
|
except Exception:
|
|||
|
pass
|
|||
|
else:
|
|||
|
result.append(v)
|
|||
|
return result
|
|||
|
|
|||
|
for filename in os.listdir(excel_dir):
|
|||
|
if filename.endswith('.xlsx'):
|
|||
|
filepath = os.path.join(excel_dir, filename)
|
|||
|
wb = openpyxl.load_workbook(filepath)
|
|||
|
for sheet_name in wb.sheetnames:
|
|||
|
ws = wb[sheet_name]
|
|||
|
rows = list(ws.iter_rows(values_only=True))
|
|||
|
if len(rows) < 2:
|
|||
|
continue
|
|||
|
headers = rows[0]
|
|||
|
types = rows[1]
|
|||
|
# 只保留字段名和类型都不为空的字段
|
|||
|
valid_indices = [
|
|||
|
i for i, (h, t) in enumerate(zip(headers, types))
|
|||
|
if h is not None and str(h).strip() != "" and t is not None and str(t).strip() != ""
|
|||
|
]
|
|||
|
valid_headers = [headers[i] for i in valid_indices]
|
|||
|
valid_types = [types[i] for i in valid_indices]
|
|||
|
data = []
|
|||
|
for row in rows[2:]:
|
|||
|
filtered_row = [row[i] if i < len(row) else None for i in valid_indices]
|
|||
|
row_dict = {}
|
|||
|
for h, t, v in zip(valid_headers, valid_types, filtered_row):
|
|||
|
if t.endswith("[]"):
|
|||
|
elem_type = t[:-2]
|
|||
|
row_dict[h] = parse_array_field(v, elem_type)
|
|||
|
else:
|
|||
|
row_dict[h] = v
|
|||
|
id_value = row_dict.get("id")
|
|||
|
# 只导出id为数字且不为空的行
|
|||
|
if id_value is not None and isinstance(id_value, (int, float)) and str(int(id_value)).isdigit():
|
|||
|
data.append(row_dict)
|
|||
|
if not data:
|
|||
|
continue
|
|||
|
out_name = f"{sheet_name}.json"
|
|||
|
out_path = os.path.join(output_dir, out_name)
|
|||
|
# 写入json,每个对象单独一行
|
|||
|
with open(out_path, 'w', encoding='utf-8') as f:
|
|||
|
f.write('[\n')
|
|||
|
for i, obj in enumerate(data):
|
|||
|
line = json.dumps(obj, ensure_ascii=False, separators=(',', ':'))
|
|||
|
if i < len(data) - 1:
|
|||
|
f.write(line + ',\n')
|
|||
|
else:
|
|||
|
f.write(line + '\n')
|
|||
|
f.write(']')
|
|||
|
print(f"导出: {out_path}")
|