excelToLua.py 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  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. data = openxml(excel_dir+filename)
  113. for table in data:
  114. if table.name not in sheets:
  115. continue
  116. print 'trans excel:' ,filename,table.name
  117. v = sheets[table.name]
  118. sheets[table.name]=None
  119. destfilename = os.path.join(lua_data_dir+v[1], table.name + ".lua")
  120. table2lua(table,v[0],destfilename)
  121. for (k,v) in sheets.items():
  122. if v == None:
  123. continue
  124. print 'error : ',filename,k,'not exist!'
  125. exception()
  126. def tag2luaTable(tagname,taglist):
  127. ret = u"{"
  128. for name in taglist:
  129. v = u"\"" + tagname + u"." + name + u"\","
  130. ret = ret + v
  131. ret = ret + u"}"
  132. return ret
  133. if __name__ == '__main__':
  134. reload(sys)
  135. sys.setdefaultencoding( "utf-8" )
  136. if os.path.isdir(lua_data_dir):
  137. shutil.rmtree(lua_data_dir)
  138. os.mkdir(lua_data_dir)
  139. map_tag = dict()
  140. file = open("LuaConfig.txt")
  141. r = re.compile('(\t|\n|\r)')
  142. sheetMap = dict()
  143. while True:
  144. lines = file.readlines(1000)
  145. if not lines:
  146. break
  147. for line in lines:
  148. if line.startswith('#'):
  149. continue
  150. line = r.sub('',line)
  151. if line == "":
  152. continue
  153. x = line.split(':')
  154. if len(x)<2:
  155. print 'error:',line
  156. file.close()
  157. exception()
  158. if x[0] not in sheetMap:
  159. sheetMap[x[0]]=dict()
  160. if len(x) <3:
  161. sheetMap[x[0]][x[1]]=(None,"")
  162. elif len(x)<4:
  163. sheetMap[x[0]][x[1]]=(x[2],"")
  164. else:
  165. sheetMap[x[0]][x[1]]=(x[2],x[3])
  166. tag_str = x[3]
  167. if tag_str != '':
  168. dir_str = os.path.join(lua_data_dir, tag_str)
  169. if not os.path.isdir(dir_str):
  170. os.mkdir(dir_str)
  171. map_tag[tag_str] = []
  172. map_tag[tag_str].append(x[1])
  173. file.close()
  174. for (k,v) in sheetMap.items():
  175. excelTolua(k,v)
  176. if len(map_tag) > 0:
  177. mfilename = os.path.join(lua_data_dir, "_merge_.lua")
  178. f = codecs.open(mfilename,"w","utf-8")
  179. f.write(u"return {\n")
  180. for k,v in map_tag.items():
  181. line = k + u" = " + tag2luaTable(k,v) + u",\n"
  182. f.write(line)
  183. f.write(u"}")
  184. f.close()