基于openpyxl的excel转换工具。支持xlsx文件转换为erlang,elixir,lua,json,xml,python等配置文件
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

261 lines
8.6 KiB

#! python
# -*- coding:utf-8 -*-
import os
import sys
from writer import *
try:
basestring
except NameError:
basestring = str
try:
long
except NameError:
long = int
# python3中没有unicode了
try:
unicode
except NameError:
unicode = str
# 加上不确定的层级缩进,60比较合适
BASE_LENGTH = 60
BASE_INDENT = " "
INDENT_LIST = {}
class ErlangerlWriter(Writer):
# 文件后缀
def suffix(self):
return ".erl"
def comment(self):
comment = [
'%% Automatic generation from -->>'
'\n%% excel file name : ' + self.doc_name +
'\n%% excel sheet name : ' + self.sheet_name,
'\n-module(' + self.base_name + ').',
'\n'
]
return "\n".join( comment )
# 获取缩进字符串
def indent_ctx( self,indent ):
if indent <= 0: return ""
if indent not in INDENT_LIST:
INDENT_LIST[indent] = ""
else:
ctx = BASE_INDENT*indent
INDENT_LIST[indent] = ctx
return INDENT_LIST[indent]
def dict_to_text(self, value, indent) :
dict_text_list = []
dict_text_list.append("-compile([export_all, nowarn_export_all]).\n\n")
for k in ( value ) :
k_indent,lk = self.to_target_lang( k,indent )
is_indent,lv = self.to_target_lang( value[k],indent + 1 )
comment = self.comment_text[k]
val_type = type( lk )
if str == val_type :
lk = lk.replace("<<\"", "\'")
lk = lk.replace("\"/utf8>>", "\'")
key = "".join( ["get(",lk,") ->\n"] )
val = "".join( ["%% ", comment, "\n", key, " ", lv, ";\n\n"] )
dict_text_list.append( val )
dict_str = "".join( dict_text_list )
dict_str = dict_str + "get(_) ->\n undefined."
return False, dict_str
def list_to_text(self, value, indent):
list_text_list = []
val = "-include(\"" + self.base_name + ".hrl\").\n" + "-compile([export_all, nowarn_export_all]).\n\n"
list_text_list.append(val)
all_key_list = []
# 生成 get() 函数
for i, onedict in enumerate( value ) :
# 生成对应的 key
key_list = []
for k in ( onedict ) :
if None != self.keys_list.get(k, None) :
is_indent,lv = self.to_target_lang( onedict[k],indent + 1 )
key_list.append(lv)
all_key_list.append(key_list)
tem = ", ".join( key_list )
key = "".join( ["get(",tem,") ->\n #", self.base_name, "{\n "] )
# 生成对应的value
value_list = []
for k in ( onedict ) :
k_indent,lk = self.to_target_lang( k,indent )
is_indent,lv = self.to_target_lang( onedict[k],indent + 1 )
val_type = type( lk )
if str == val_type :
lk = lk.replace("<<\"", "\'")
lk = lk.replace("\"/utf8>>", "\'")
oneval = "".join( [lk, " = ", lv , "\n"] )
value_list.append( oneval )
value_list_str = " , ".join(value_list)
end_str = "".join( [key, value_list_str, "};\n\n"] )
list_text_list.append( end_str )
underline_list = []
for i in self.keys_list :
underline_list.append('_')
end_str = ", ".join(underline_list)
no_match_str = "get(" + end_str + ") ->\n undefined.\n\n"
list_text_list.append(no_match_str)
# 生成 get_all() 函数
get_all_fun = []
for i, ival in enumerate(all_key_list) :
oneval = '{' + ", ".join(ival) + '}\n'
get_all_fun.append(oneval)
value_list_str = " , ".join(get_all_fun)
start_str = 'getList() ->\n [\n '
end_str = "".join( [start_str, value_list_str, " ].\n\n"] )
# 生成 get_list() 函数
get_list_fun = []
keys_len = len(self.keys_list)
for key in self.keys_list :
keyindex = self.keys_list[key]
if keyindex == 1 :
"skip"
elif keyindex <= keys_len :
get_tem_dict = {}
underline_list = []
for i, ival in enumerate(all_key_list) :
key_tem_list = []
j = 0
underline_list = []
while j < keyindex - 1 :
key_tem_list.append(ival[j])
underline_list.append('_')
j += 1
keystr = '(' + ", ".join(key_tem_list) + ')'
if None != get_tem_dict.get(keystr, None) :
oldlist = get_tem_dict[keystr]
oldlist.append(ival)
get_tem_dict[keystr] = oldlist
else :
get_tem_dict[keystr] = [ival]
for onekey in get_tem_dict :
value_tem_list = []
valuelist = get_tem_dict[onekey]
for l, lval in enumerate(valuelist) :
oneval = '{' + ", ".join(lval) + '}\n'
value_tem_list.append(oneval)
start = 'getList' + onekey + ' ->\n [\n '
val = "".join( [start, " , ".join(value_tem_list), " ];\n\n"] )
get_list_fun.append(val)
no_match_str = "".join('getList(' + ", ".join(underline_list) + ') ->\n [].\n\n')
get_list_fun.append(no_match_str)
if self.is_list == True:
value_list = "".join(get_list_fun)
list_text_list.append( end_str )
list_text_list.append( value_list )
dict_str = "".join( list_text_list )
return False, dict_str
# 转换为文本数据 之前解析出来的excel数据存放方式存在LIST(array格式)和DICT(object格式)两种类型
def to_text(self,value,indent):
val_type = type( value )
if dict == val_type :
return self.dict_to_text(value, indent)
else :
return self.list_to_text(value, indent)
# python的dict转换为erlang的map类型
def dict_to_erlang(self,value,indent):
dict_ctx_list = []
for k in ( value ) :
k_indent,lk = self.to_target_lang( k,indent )
is_indent,lv = self.to_target_lang( value[k],indent + 1 )
val_type = type( lk )
if str == val_type :
lk = lk.replace("<<\"", "\'")
lk = lk.replace("\"/utf8>>", "\'")
key = "".join( [lk," => "] )
val = "".join( [key, lv] )
dict_ctx_list.append(val)
dict_str = ", ".join( dict_ctx_list )
return False,"".join( ["#{",dict_str,"}"] )
# python的list转换为erlang的list类型
def list_to_erlang(self,value,indent):
list_ctx_list = []
for v in value :
is_indent,lv = self.to_target_lang( v,indent + 1 )
list_ctx_list.append( lv )
list_str = ", ".join( list_ctx_list )
return False,"".join( ["[",list_str,"]"] )
# python的tuple转换为erlang的tuple类型
def tuple_to_erlang(self,value,indent):
tuple_ctx_list = []
for v in value :
is_indent,lv = self.to_target_lang( v,indent + 1 )
tuple_ctx_list.append( lv )
# 返回 {a,b,c}这种不换行的格式
list_str = ", ".join( tuple_ctx_list )
return False,"".join( ["{",list_str,"}"] )
# 变量转换到目标语言的字符串
def to_target_lang(self,value,indent):
val_type = type( value )
if int == val_type :
return False,str( value )
elif long == val_type :
return False,str( value )
elif float == val_type :
# 1001.0 -->> 001 去除多余小数点
if int( value ) == value :
return False,str( int(value) )
return False,str( value )
elif str == val_type or unicode == val_type:
return False, "".join(["<<\"",value,"\"/utf8>>"])
elif tuple == val_type :
return self.tuple_to_erlang(value,indent)
elif dict == val_type :
return self.dict_to_erlang(value,indent)
elif list == val_type :
return self.list_to_erlang(value,indent)
else :
raise Exception( "invalid type",val_type )
#文件内容
def context(self,ctx):
is_indent,str_ctx = self.to_text( ctx,0 )
return "".join( [self.comment(),"",str_ctx] )