excelToLua.py 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. # -*- coding: UTF-8 -*-
  2. import os
  3. import os.path
  4. import sys
  5. import codecs
  6. import shutil
  7. import re
  8. from util import *
  9. lua_data_dir = "../lua/"
  10. excel_dir = "../策划脚本/".decode('utf-8')
  11. def table2lua(table,main_key, jsonfilename):
  12. con_array = []
  13. uncon_array = []
  14. nrows = table.nrows
  15. ncols = table.ncols
  16. if os.path.exists(jsonfilename):
  17. print 'error : ',jsonfilename,'already exist!'
  18. exception()
  19. f = codecs.open(jsonfilename,"w","utf-8")
  20. f.write(u"return {\n")
  21. if main_key != None and main_key != "":
  22. main_key = main_key.split("@")
  23. objNames = []
  24. objTypes = []
  25. for r in range(1,nrows):
  26. if r == 2:
  27. continue
  28. line = u"{"
  29. if r == 1:
  30. line = u"[\"_key_\"] = " + line
  31. main_key_list = []
  32. for c in range(ncols):
  33. strCellValue = u""
  34. if c>=len(objNames):
  35. objNames.append(str(table.cell_value(1,c)))
  36. objTypes.append(str(table.cell_value(2,c)))
  37. objName = objNames[c]
  38. objType = objTypes[c]
  39. objStr = table.cell_value(r,c) or ""
  40. if(objName.find("@") >= 0):
  41. continue
  42. if(len(objName) == 0):
  43. continue
  44. if len(con_array) > 0:
  45. check = False
  46. for it in con_array:
  47. if it == objName:
  48. check = True
  49. break
  50. if not check:
  51. continue
  52. elif len(uncon_array) > 0:
  53. check = True
  54. for it in uncon_array:
  55. if it == objName:
  56. check = False
  57. break
  58. if not check:
  59. continue
  60. if r == 0 or r == 1:
  61. if type(objStr) == float:
  62. firstCol = str(table.cell_value(r,0))
  63. print 'Type Error: (row:%s,col:%s)' % (firstCol,objName)
  64. exception()
  65. strCellValue = u"\"" + objStr + u"\""
  66. else:
  67. if cmp(objType, "NUMBER") == 0 or cmp(objType, "FLOAT") == 0:
  68. strCellValue = FloatToString(objStr)
  69. if strCellValue == False:
  70. print u"fail to read \t"+str(r+1)+":"+str(table.cell_value(r,1))+"\t"+int2index(c)+":"+str(table.cell_value(0,c))
  71. exception()
  72. else:
  73. strvalue = StringToString(objStr).strip();
  74. strvalue = "".join(strvalue.split("\n"))
  75. strCellValue = u"\"" + strvalue + u"\""
  76. line = line + strCellValue
  77. if (main_key == None or main_key==""):
  78. main_key = [objName]
  79. if r > 1 and objName in main_key:
  80. if len(main_key_list) < len(main_key) :
  81. if main_key.index(objName) == 0:
  82. main_key_list = [strCellValue]+main_key_list
  83. else:
  84. main_key_list = main_key_list+[strCellValue]
  85. if len(main_key_list) == len(main_key) :
  86. # if [x for x in main_key_list if x!= 0 and x!="" ] == 0:
  87. # continue
  88. if len(main_key_list) > 1:
  89. line = u"[\"" + main_key_list[0]+"@"+main_key_list[1] + u"\"] = " + line
  90. else:
  91. line = u"[" + main_key_list[0]+ u"] = " + line
  92. line += u","
  93. # if c < ncols-1:
  94. # isNext = haveNext(table, c+1, 1, ncols)
  95. # if isNext != 0:
  96. #f.write(strCellValue)
  97. line = line + u"}"
  98. f.write(line)
  99. if r>1 and len(main_key_list)==0:
  100. print "指定 键值不存在".decode('utf-8'),main_key[0],":",table.name
  101. f.close()
  102. exception()
  103. # f.write(u" }")
  104. # if r < nrows-1:
  105. # f.write(u",")
  106. # f.write(u"\n")
  107. f.write(u",\n")
  108. f.write(u"}")
  109. f.close()
  110. return
  111. def excelTolua(filename,sheets):
  112. print 'trans file:' ,filename
  113. data = openxml(excel_dir+filename)
  114. for table in data:
  115. if table.name not in sheets:
  116. continue
  117. print 'trans excel:' ,filename,table.name
  118. v = sheets[table.name]
  119. sheets[table.name]=None
  120. destfilename = os.path.join(lua_data_dir+v[1], table.name + ".lua")
  121. table2lua(table,v[0],destfilename)
  122. for (k,v) in sheets.items():
  123. if v == None:
  124. continue
  125. print 'error : ',filename,k,'not exist!'
  126. exception()
  127. def tag2luaTable(tagname,taglist):
  128. ret = u"{"
  129. for name in taglist:
  130. v = u"\"" + tagname + u"." + name + u"\","
  131. ret = ret + v
  132. ret = ret + u"}"
  133. return ret
  134. if __name__ == '__main__':
  135. reload(sys)
  136. sys.setdefaultencoding( "utf-8" )
  137. if os.path.isdir(lua_data_dir):
  138. shutil.rmtree(lua_data_dir)
  139. os.mkdir(lua_data_dir)
  140. map_tag = dict()
  141. file = open("LuaConfig.txt")
  142. r = re.compile('(\t|\n|\r)')
  143. sheetMap = dict()
  144. while True:
  145. lines = file.readlines(1000)
  146. if not lines:
  147. break
  148. for line in lines:
  149. if line.startswith('#'):
  150. continue
  151. line = r.sub('',line)
  152. if line == "":
  153. continue
  154. x = line.split(':')
  155. if len(x)<2:
  156. print 'error:',line
  157. file.close()
  158. exception()
  159. if x[0] not in sheetMap:
  160. sheetMap[x[0]]=dict()
  161. if len(x) <3:
  162. sheetMap[x[0]][x[1]]=(None,"")
  163. elif len(x)<4:
  164. sheetMap[x[0]][x[1]]=(x[2],"")
  165. else:
  166. sheetMap[x[0]][x[1]]=(x[2],x[3])
  167. tag_str = x[3]
  168. if tag_str != '':
  169. dir_str = os.path.join(lua_data_dir, tag_str)
  170. if not os.path.isdir(dir_str):
  171. os.mkdir(dir_str)
  172. map_tag[tag_str] = []
  173. map_tag[tag_str].append(x[1])
  174. file.close()
  175. for (k,v) in sheetMap.items():
  176. excelTolua(k,v)
  177. if len(map_tag) > 0:
  178. mfilename = os.path.join(lua_data_dir, "_merge_.lua")
  179. f = codecs.open(mfilename,"w","utf-8")
  180. f.write(u"return {\n")
  181. for k,v in map_tag.items():
  182. line = k + u" = " + tag2luaTable(k,v) + u",\n"
  183. f.write(line)
  184. f.write(u"}")
  185. f.close()