91 lines
3.2 KiB
Python
91 lines
3.2 KiB
Python
import os
|
||
import json
|
||
import openpyxl
|
||
import re
|
||
|
||
excel_dir = 'excel'
|
||
output_dir = 'src/ReplicatedStorage/Json'
|
||
|
||
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}")
|