2023-04-03 11:04:31 +08:00

337 lines
12 KiB
Python

#!/usr/bin/python3
# -*- coding: UTF-8 -*-
from pickletools import read_int4
from traceback import print_tb
import util
import os
import re
import type_deal
# return {head_list, name_list, type_list, export_color, lang_color, data}
def read_data_new(get_max_row, get_max_col, access, _access_color, path, get_rows=None):
max_row = get_max_row()
max_col = get_max_col()
status = 'export_row'
head_row, export_row, name_row, type_row, data_row = 0, 0, 0, 0, 0
head_list, export_list, name_list, type_list, data_list = [], [], [], [] ,[]
# 查到第一行有用数据的row_index
start_i = 0
for i in range(10):
col_1 = access(i, 0)
if not col_1:
continue
if not isinstance(col_1, str):
continue
if col_1.startswith("//"):
continue
start_i = i
break
# print(u"测试数据 startRow %d" % start_i)
# 查到列导出类型、name、字段type以及实际数据的row_index
for i in range(start_i, 10):
if status in ('export_row', ):
export_row = i
for j in range(max_col):
export_list.append(access(i, j))
status = 'name_row'
elif status in ('name_row', ):
name_row = i
for j in range(max_col):
name_list.append(access(i, j))
status = 'type_row'
elif status in ('type_row', ):
type_row = i
data_row = i + 1
for j in range(max_col):
type_list.append((access(i, j)))
break
else:
raise Exception('unknown error')
max_col = len(type_list)
while not type_list[max_col-1]:
max_col -= 1
type_list = type_list[:max_col]
if data_row == 0:
raise Exception("excel file data is wrong")
data_list = []
spaceRowCountDown = 0
space_row_list = []
spaceCloCountDown = 0
for i in range(0, get_max_col()):
row_1 = access(0, i)
# if col_1 is None or col_1 == "":
# continue
if row_1 is None or row_1 == "":
spaceCloCountDown += 1
if spaceCloCountDown >= 10:
raise Exception("file name %s more than ten space column" % path)
break
else:
continue
else:
spaceCloCountDown = 0
if get_rows:
rows = get_rows()
cur_row = 0
for row in rows:
cur_row += 1
if cur_row - 1 < data_row:
continue
one_row = []
col_1 = row[0].value
if col_1 is None or col_1 == "":
space_row_list.append(cur_row)
spaceRowCountDown += 1
if spaceRowCountDown >= 10:
raise Exception("file name %s more than ten space row" % path)
break
else:
continue
else:
spaceRowCountDown = 0
for j in range(max_col):
v = row[j].value
if v is None:
one_row.append("")
else:
one_row.append(v)
data_list.append(one_row)
else:
for i in range(data_row, max_row):
one_row = []
col_1 = access(i, 0)
if col_1 is None or col_1 == "":
spaceRowCountDown += 1
if spaceRowCountDown >= 10:
raise Exception("file name %s more than ten space row" % path)
break
else:
continue
else:
spaceRowCountDown = 0
for j in range(max_col):
v = access(i, j)
if v is None:
one_row.append("")
else:
v = v.encode("UTF-8")
one_row.append(v)
data_list.append(one_row)
return {
'head_row': head_row,
'export_row': export_row,
'name_row': name_row,
'type_row': type_row,
'data_row': data_row,
'head_list': head_list,
'export_list': export_list,
'name_list': name_list,
'type_list': type_list,
'data_list': data_list,
'space_row_list': space_row_list,
}
def xlsx_read_new(path):
from openpyxl import load_workbook
wb = load_workbook(path, data_only=True)
data = []
data_read = False
for sheet in wb:
gmr, gmc, access, access_color, get_rows = util.xlsx_get_function(sheet)
if not data_read:
data = read_data_new(gmr, gmc, access, access_color, path, get_rows)
data_read = True
wb.close()
return {
'data': data,
}
def create_dirs(path_info, customPath = None):
src_folder = path_info['folder_path']
dest_folder = path_info['dump_path']
file_path = path_info['file_path']
dest_file_path = file_path.replace(src_folder, dest_folder)
deep_dir = os.path.dirname(dest_file_path)
if customPath != None:
deep_dir = customPath
if not os.path.isdir(deep_dir):
try:
os.makedirs(deep_dir)
except Exception as e:
print (str(e))
if not os.path.isdir(deep_dir):
raise Exception("could not create dir(%s)" % deep_dir)
return deep_dir
def convert(path, struct_config, config=None):
os.path.relpath(path['file_path'], path['folder_path'])
excel_data = xlsx_read_new(path['file_path'])
excel_data["config"] = struct_config
excel_objs = []
match_result = re.match('.+strings', path['file_path'])
if match_result:
#对多语言相关表进行特殊处理
name_type_dict = dict()
main_keys = []
none_count = 0
for i in range(len(excel_data['data']['name_list'])):
if i == 0 or excel_data['data']['export_list'][i] == 'none':
continue
name = excel_data['data']['name_list'][i]
if name == None:
none_count = none_count + 1
if none_count > 10:
raise Exception('more than ten none column xx-xx path string/%s' % os.path.basename(path['file_path']))
return
continue
if name.startswith('*'):
main_keys.append(i)
continue
split_data = name.split('-')
if len(split_data) != 2 and (not name.startswith('*')):
raise Exception('local config name is not xx-xx(lanuage) path string.%s ' % os.path.basename(path['file_path']))
return
excel_data['data']['name_list'][i] = split_data[0]
if not name_type_dict.get(split_data[1]):
name_type_dict[split_data[1]] = []
name_type_dict[split_data[1]].append(i)
#除id外主键加入
for language, indexs in name_type_dict.items():
for main_key_index in main_keys:
indexs.append(main_key_index)
for language, indexs in name_type_dict.items():
excel_tmp_data = {
'data' : {
'head_row' : excel_data['data']['head_row'],
'export_row' : excel_data['data']['export_row'],
'name_row' : excel_data['data']['name_row'],
'type_row' : excel_data['data']['type_row'],
'data_row' : excel_data['data']['data_row'],
'space_row_list' : excel_data['data']['space_row_list'],
},
'config' : excel_data['config']
}
excel_tmp_data['data']['head_list'] = []
excel_tmp_data['data']['name_list'] = []
excel_tmp_data['data']['type_list'] = []
excel_tmp_data['data']['export_list'] = []
excel_tmp_data['data']['data_list'] = []
#添加主键
excel_tmp_data['data']['name_list'].append(excel_data['data']['name_list'][0])
excel_tmp_data['data']['type_list'].append(excel_data['data']['type_list'][0])
excel_tmp_data['data']['export_list'].append(excel_data['data']['export_list'][0])
data_row = len(excel_data['data']['data_list'])
for w in range(data_row):
excel_tmp_data['data']['data_list'].append([])
excel_tmp_data['data']['data_list'][w].append(excel_data['data']['data_list'][w][0])
for i in range(len(indexs)):
index = indexs[i]
excel_tmp_data['data']['name_list'].append(excel_data['data']['name_list'][index])
excel_tmp_data['data']['type_list'].append(excel_data['data']['type_list'][index])
excel_tmp_data['data']['export_list'].append(excel_data['data']['export_list'][index])
for j in range(data_row):
excel_tmp_data['data']['data_list'][j].append(excel_data['data']['data_list'][j][index])
deep_dir = os.path.join(path['dump_path'], 'strings')
deep_dir = os.path.join(deep_dir, language)
create_dirs(path, deep_dir)
excel_obj = conver_pri(excel_tmp_data, path, deep_dir, config)
if excel_obj:
excel_objs.append(excel_obj)
else:
deep_dir = create_dirs(path)
excel_obj = conver_pri(excel_data, path, deep_dir, config)
if excel_obj:
excel_objs.append(excel_obj)
return excel_objs
def conver_pri(excel_data, path, deep_dir, config=None):
file_name = os.path.basename(path['file_path']).split('.')[0]
reldir = os.path.relpath(os.path.dirname(path['file_path']), path['folder_path'])
package_name = 'config'
if reldir == ".":
if config.get('go_package'):
package_name = config.get("go_package", "config")
else:
package_name = os.path.basename(reldir)
kts, type_mapping = type_deal.format_key_type_list(excel_data['data']['name_list'], excel_data['data']['type_list'],
excel_data['data']['export_list'], excel_data['config'])
#如果所有字段都为服务器需要或None则客户端不需要导出
if type_deal.need_export_table(kts):
return None
key_set, full_data = type_deal.construct_data(path, kts, type_mapping, excel_data['data']['data_list'], excel_data['data']['space_row_list'])
erl_suffix = 'erl'
lua_suffix = 'lua'
go_suffix = 'go'
lua_compact = False
if config and config.get('erl_suffix'):
erl_suffix = config['erl_suffix']
if config and config.get('lua_suffix'):
lua_suffix = config['lua_suffix']
if config and config.get('lua_compact'):
lua_compact = True
if config and config.get('erlang'):
erl_data = type_deal.construct_erl_data(kts, type_mapping, key_set, full_data, file_name, '\t')
write_file(os.path.join(deep_dir, 'cfg_%s.%s' % (file_name, erl_suffix)), erl_data)
del erl_data
if config and config.get('lua'):
lua_data = type_deal.construct_lua_data(path, kts, type_mapping, key_set, full_data, file_name, lua_compact, '\t')
name = '%s.%s' % (file_name, lua_suffix)
if config and config.get('lua_force_lowercase', False):
name = name.lower()
write_file(os.path.join(deep_dir, name), lua_data)
del lua_data
if config and config.get('go'):
go_data = type_deal.construct_go_data(kts, type_mapping, key_set, full_data, file_name, package_name, '\t')
name = 'cfg_%s.%s' % (file_name, go_suffix)
name = name.lower()
write_file(os.path.join(deep_dir, name), go_data)
del go_data
excel_obj = dict()
excel_obj["file_name"] = os.path.basename(path["file_path"])
excel_obj["file_path"] = path["file_path"]
excel_obj["data"] = full_data
excel_obj["key_set"] = key_set
excel_obj["kts"] = kts
excel_obj["type_mapping"] = type_mapping
excel_obj["space_row_list"] = excel_data['data']['space_row_list']
return excel_obj
def write_file(file_path, data):
f = open(file_path, "w", encoding="utf-8")
f.write(data)
f.close()