excelToLua_vietnam.py 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416
  1. import os
  2. import os.path
  3. import sys
  4. import codecs
  5. import xlrd
  6. import shutil
  7. import re
  8. import copy
  9. from _ast import Or
  10. lua_data_dir = "../lua"
  11. ZONE = "vietnam"
  12. dictDir = "..\dict"+"\\" +ZONE
  13. dictDir = unicode(dictDir,'utf8')
  14. csvDir = ".\client_csv_config"
  15. #csvDir = "..\csv"
  16. csvDir = unicode(csvDir,'utf8')
  17. destCsvDir = "..\\..\\GameEditors\\UIEdit\\res\\ui_edit\\config\\"
  18. #destCsvDir = "..\destCsv\\"
  19. uiDir = "..\\..\\GameEditors\\UIEdit\\res\\ui_edit\\xmds_ui\\"
  20. scenesDir = "..\\..\\GameEditors\\GameEditor\\data\\scenes\\"
  21. itemDir = "..\\..\\GameEditors\\GameEditor\\data\\items\\"
  22. uiPattern = "([tT]?ext=\".*?\")"
  23. scenesPattern = "(<element>showname=.*?</element>)"
  24. itemsPattern = "(<PickActionName>.*?</PickActionName>)"
  25. translatedFile = dictDir + '\\translated.xls'
  26. transDict = {}
  27. unTransDict = {}
  28. def isContainChinese(check_str):
  29. for ch in check_str.decode('utf-8'):
  30. if u'\u4e00' <= ch <= u'\u9fff':
  31. return True
  32. return False
  33. def logUntranslatedStr(lgFile):
  34. if len(unTransDict) > 0 :
  35. type = sys.getfilesystemencoding()
  36. lgFile.write(u"\r\n")
  37. lgFile.write("===================Following words those can't find in dictionary=========================\r\n")
  38. print "Warning!!! Can't find in dictionary, please check log file excelToLua.txt ========================="
  39. for key in unTransDict.keys():
  40. print key.decode('utf-8').encode(type)
  41. lgFile.write(key)
  42. lgFile.write(u"\r\n")
  43. print "Warning!!! Can't find in dictionary, please check log file excelToLua.txt ========================="
  44. return
  45. def loadTranslatedDict():
  46. data = xlrd.open_workbook(translatedFile)
  47. print "Begin loadTranslatedDict : " + translatedFile
  48. for table in data.sheets():
  49. print " sheet : " + table.name
  50. try:
  51. nrows = table.nrows
  52. ncols = table.ncols
  53. if nrows <= 3:
  54. return
  55. for r in range(nrows):
  56. if ncols<2:
  57. continue
  58. key = str(table.cell_value(r,0)).strip()
  59. val = str(table.cell_value(r,1)).strip()
  60. if len(key)>0 and len(val)>0 :
  61. transDict[key] = val
  62. except Exception,e:
  63. print Exception,":",e
  64. os.system('pause')
  65. print "loadTranslatedDict OK"
  66. return
  67. def transCsv(srcCsv,destCsv,lgFile):
  68. print 'begin convert csv: ' + srcCsv
  69. lgFile.write('csv dir: ' + srcCsv)
  70. lgFile.write(u"\r\n")
  71. try:
  72. dic = []
  73. with open(srcCsv, "r") as csvfile:
  74. reader = csvfile.readlines()
  75. for strCellValue in reader:
  76. line = strCellValue
  77. if(isContainChinese(strCellValue)):
  78. index = strCellValue.find(',')
  79. if index > 0:
  80. val1 = strCellValue[0:index]
  81. val2 = strCellValue[index+1:len(strCellValue)]
  82. #去除首尾空格、首尾双引号,末尾逗号
  83. key = val2.strip()
  84. key = key.rstrip(',')
  85. key = key.strip('\"')
  86. key = key.strip()
  87. if transDict.has_key(key) :
  88. reVal = transDict.get(key)
  89. val2 = val2.replace(key,reVal)
  90. else:
  91. unTransDict[key] = ''
  92. line = val1+','+val2
  93. print line
  94. dic.append(line)
  95. csvfile.close()
  96. print "---------dic size: " + str(len(dic))
  97. #write back to the csvfile
  98. with open(destCsv,"w") as csvfile:
  99. csvfile.writelines(dic)
  100. csvfile.close()
  101. except Exception,e:
  102. print Exception,":",e
  103. os.system('pause')
  104. lgFile.write(srcCsv)
  105. lgFile.write(u" ......converted \r\n")
  106. def FloatToString (aFloat):
  107. if len(str(aFloat)) == 0:
  108. return '0';
  109. if type(aFloat) != float:
  110. print aFloat+" - 数字类型格式错误"
  111. os.system("pause")
  112. return ""
  113. strTemp = str(aFloat)
  114. strList = strTemp.split(".")
  115. if len(strList) == 1 :
  116. return strTemp
  117. else:
  118. if strList[1] == "0" :
  119. return strList[0]
  120. else:
  121. return strTemp
  122. def StringToString (aStr):
  123. if type(aStr) != float:
  124. return str(aStr)
  125. strTemp = str(aStr)
  126. strList = strTemp.split(".")
  127. if len(strList) == 1 :
  128. return strTemp
  129. else:
  130. if strList[1] == "0" :
  131. return strList[0]
  132. else:
  133. return strTemp
  134. def haveNext(table, col, row, max_cols):
  135. for c in range(col, max_cols):
  136. objType = str(table.cell_value(row, c));
  137. if(objType.find("@") == -1):
  138. return 1
  139. return 0
  140. def table2lua(table, jsonfilename, main_key=None, con_str=None,uncon_str=None):
  141. con_array = []
  142. uncon_array = []
  143. if con_str:
  144. con_array = con_str.split('|')
  145. if uncon_str:
  146. uncon_array = uncon_str.split('|')
  147. nrows = table.nrows
  148. ncols = table.ncols
  149. if os.path.exists(jsonfilename):
  150. print 'error : ',jsonfilename,'already exist!'
  151. exit(1)
  152. f = codecs.open(jsonfilename,"w","utf-8")
  153. f.write(u"return {\n")
  154. for r in range(1,nrows):
  155. if r == 2:
  156. continue
  157. line = u"{"
  158. #f.write(u"\t{ ")
  159. for c in range(ncols):
  160. strCellValue = u""
  161. objName = str(table.cell_value(1,c))
  162. objType = str(table.cell_value(2,c))
  163. objStr = table.cell_value(r,c)
  164. if(objName.find("@") >= 0 or objType.find("@")>=0 ):
  165. continue
  166. if len(con_array) > 0:
  167. check = False
  168. for it in con_array:
  169. if it == objName:
  170. check = True
  171. break
  172. if not check:
  173. continue
  174. elif len(uncon_array) > 0:
  175. check = True
  176. for it in uncon_array:
  177. if it == objName:
  178. check = False
  179. break
  180. if not check:
  181. continue
  182. if r == 0 or r == 1:
  183. if type(objStr) == float:
  184. firstCol = str(table.cell_value(r,0))
  185. print 'Type Error: (row:%s,col:%s)' % (firstCol,objName)
  186. exit(1)
  187. strCellValue = u"\"" + objStr + u"\""
  188. else:
  189. if cmp(objType, "NUMBER") == 0 or cmp(objType, "FLOAT") == 0:
  190. strCellValue = FloatToString(objStr)
  191. if strCellValue == '':
  192. firstCol = str(table.cell_value(r,0))
  193. print 'Type Error: (row:%s,col:%s)' % (firstCol,objName)
  194. exit(1)
  195. else:
  196. keyStr = str(objStr).strip()
  197. if isContainChinese(keyStr):
  198. if transDict.has_key(keyStr):
  199. objStr = transDict.get(keyStr)
  200. else:
  201. unTransDict[objStr] = ""
  202. strvalue = StringToString(objStr).strip();
  203. strvalue = "".join(strvalue.split("\n"))
  204. strCellValue = u"\"" + strvalue + u"\""
  205. if main_key and main_key == objName:
  206. line = line + strCellValue
  207. #key row
  208. if r == 1:
  209. line = u"[\"_key_\"] = " + line
  210. else:
  211. line = u"[" + strCellValue + u"] = " + line
  212. else:
  213. line = line + strCellValue
  214. line += u","
  215. # if c < ncols-1:
  216. # isNext = haveNext(table, c+1, 1, ncols)
  217. # if isNext != 0:
  218. #f.write(strCellValue)
  219. line = line + u"}"
  220. f.write(line)
  221. # f.write(u" }")
  222. # if r < nrows-1:
  223. # f.write(u",")
  224. # f.write(u"\n")
  225. f.write(u",\n")
  226. f.write(u"}")
  227. f.close()
  228. print "Create ",jsonfilename," OK"
  229. return
  230. def excelTolua(key, main_key=None,con_str=None,uncon_str=None,dirstr=None):
  231. print 'begin trans excel:' + key
  232. data = xlrd.open_workbook(key.split(':')[0])
  233. if not dirstr:
  234. dirstr = lua_data_dir
  235. for table in data.sheets():
  236. if key.split(':')[1] == table.name:
  237. #do
  238. destfilename = os.path.join(dirstr, table.name + ".lua")
  239. table2lua(table,destfilename,main_key,con_str,uncon_str)
  240. return table.name
  241. print 'error : ',key,'not exist!'
  242. exit(1)
  243. def tag2luaTable(tagname,taglist):
  244. ret = u"{"
  245. for name in taglist:
  246. v = u"\"" + tagname + u"." + name + u"\","
  247. ret = ret + v
  248. ret = ret + u"}"
  249. return ret
  250. def xmlToDict(xmlFileName,destPattern,lgFile):
  251. print 'begin trans xml:' + xmlFileName
  252. lgFile.write('xml file:' + xmlFileName)
  253. lgFile.write(u"\r\n")
  254. data = open(xmlFileName,"rU")
  255. try:
  256. reader = data.read()
  257. newContent = reader
  258. dest = re.compile(destPattern)
  259. res = dest.findall(reader)
  260. for elem in res:
  261. strCellValue = str(elem).strip()
  262. print strCellValue
  263. if len(strCellValue) > 0 and isContainChinese(strCellValue):
  264. if transDict.has_key(strCellValue) :
  265. dest = transDict.get(strCellValue)
  266. newContent = newContent.replace(strCellValue, dest)
  267. else:
  268. unTransDict[strCellValue] = ''
  269. data.close()
  270. print "---------new xmlfile size: " + str(len(reader))
  271. #write back to the xmlfile
  272. newFile = codecs.open(xmlFileName,"wb","utf-8")
  273. newFile.write(newContent.replace("\n","\r\n"))
  274. newFile.close()
  275. except Exception,e:
  276. print Exception,":",e
  277. os.system('pause')
  278. print "trans xml OK"
  279. def walkXmlDir(xmlDir,destPattern,lgFile):
  280. print xmlDir
  281. if not os.path.exists(xmlDir):
  282. lgFile.write(xmlDir+' xml files dir not exist!!!')
  283. lgFile.write(u"\r\n")
  284. os.system('pause')
  285. for parent,dirnames,filenames in os.walk(xmlDir):
  286. for filename in filenames:
  287. if filename.endswith(".xml") :
  288. print 'filename : ' + filename
  289. excelFileName = os.path.join(parent, filename)
  290. xmlToDict(excelFileName,destPattern,lgFile)
  291. def extractXml(lgFile):
  292. walkXmlDir(uiDir, uiPattern, lgFile)
  293. walkXmlDir(scenesDir, scenesPattern, lgFile)
  294. walkXmlDir(itemDir, itemsPattern, lgFile)
  295. if __name__ == '__main__':
  296. reload(sys)
  297. sys.setdefaultencoding( "utf-8" )
  298. lgFile = codecs.open('..\excelToLua.txt',"w","utf-8")
  299. try:
  300. if os.path.exists(translatedFile):
  301. loadTranslatedDict()
  302. else:
  303. print "Can't find dict file: " + translatedFile
  304. os.system('pause')
  305. print csvDir
  306. if not os.path.exists(csvDir):
  307. lgFile.write(csvDir+' csv files dir not exist!!!')
  308. lgFile.write(u"\r\n")
  309. os.system('pause')
  310. lgFile.write('==========================Begin convert csv files==================')
  311. lgFile.write(u"\r\n")
  312. for parent,dirnames,filenames in os.walk(csvDir):
  313. for filename in filenames:
  314. print 'filename : ' + filename
  315. srcCsvFileName = os.path.join(parent, filename)
  316. destCsvFileName = destCsvDir+filename
  317. print destCsvFileName
  318. transCsv(srcCsvFileName,destCsvFileName,lgFile)
  319. lgFile.write('==========================Begin extract xml files==================')
  320. lgFile.write(u"\r\n")
  321. extractXml(lgFile)
  322. lgFile.write('==========================Convert xml files ended ==================')
  323. os.system('pause')
  324. except Exception,e:
  325. print Exception,":",e
  326. if os.path.isdir(lua_data_dir):
  327. shutil.rmtree(lua_data_dir)
  328. os.mkdir(lua_data_dir)
  329. data = xlrd.open_workbook("LuaConfig.xlsm")
  330. map_tag = dict()
  331. for table in data.sheets():
  332. if table.name == 'LuaConfig':
  333. #lua
  334. #Path Key Export Hide
  335. for r in range(3,table.nrows):
  336. key = table.cell_value(r,0)
  337. main_key = table.cell_value(r,1)
  338. con_str = table.cell_value(r,2)
  339. uncon_str = table.cell_value(r,3)
  340. tag_str = table.cell_value(r,4)
  341. dir_str = None
  342. if tag_str != '':
  343. dir_str = os.path.join(lua_data_dir, tag_str)
  344. if not os.path.isdir(dir_str):
  345. os.mkdir(dir_str)
  346. map_tag[tag_str] = []
  347. tname = excelTolua(key,main_key,con_str,uncon_str,dir_str)
  348. if dir_str:
  349. map_tag[tag_str].append(tname)
  350. if len(map_tag) > 0:
  351. mfilename = os.path.join(lua_data_dir, "_merge_.lua")
  352. f = codecs.open(mfilename,"w","utf-8")
  353. f.write(u"return {\n")
  354. for k,v in map_tag.items():
  355. line = k + u" = " + tag2luaTable(k,v) + u",\n"
  356. f.write(line)
  357. f.write(u"}")
  358. f.close()
  359. logUntranslatedStr(lgFile)
  360. lgFile.close()
  361. #os.system('echo Explorer to lua path')
  362. #os.system('exit')
  363. #os.system('explorer ' + lua_data_dir)