convert.js 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. const FILE = require('fs-extra');
  2. const XLSX = require('node-xlsx');
  3. //读取excel目录所有excel文件
  4. const files = FILE.readdirSync('./excel');
  5. const outputDir = './output';
  6. //清除输出目录
  7. FILE.emptyDirSync(outputDir);
  8. //创建JSON目录
  9. FILE.ensureDirSync(outputDir + '/json');
  10. //创建C#目录
  11. FILE.ensureDirSync(outputDir + '/cs');
  12. let Head = `using System;\nusing System.Collections.Generic;\nusing UnityEngine;\n`;
  13. let NameSpaceHead = `namespace {NAMESPACE} {\n`;
  14. let NameSpaceEnd = `}\n`;
  15. let NameSpaceCombine = {};
  16. //遍历所有excel文件
  17. for (let i = 0; i < files.length; i++) {
  18. const filePath = './excel/' + files[i];
  19. const result = convert(filePath);
  20. }
  21. Object.keys(NameSpaceCombine).forEach((key)=>{
  22. let namespace = key;
  23. let content = NameSpaceCombine[key].join('\n');
  24. let NameSpace = NameSpaceHead.replace('{NAMESPACE}',namespace);
  25. let ret = Head + NameSpace + content + NameSpaceEnd;
  26. FILE.writeFileSync(outputDir + '/cs/' + namespace + '.cs', ret);
  27. });
  28. console.log('转换完成');
  29. function convert(filePath) {
  30. //获取文件名,删除后缀并大写首字符
  31. let fileName = filePath.split('/')[2].split('.')[0];
  32. // const className = fileName.charAt(0).toUpperCase() + fileName.slice(1);
  33. fileName = fileName.charAt(0).toUpperCase() + fileName.slice(1);
  34. const workSheetsFromFile = XLSX.parse(filePath);
  35. const data = workSheetsFromFile[0].data;
  36. // console.log(data)
  37. let tableStartIndexs = [];
  38. for (let i = 0; i < data.length; i++) {
  39. for (let j = 0; j < data[i].length; j++) {
  40. if(data[i][j] === '###') {
  41. let startX = i;
  42. let startY = j;
  43. let endX = data.length-1;
  44. tableStartIndexs.push({startX,startY,endX});
  45. if(tableStartIndexs.length>1){
  46. tableStartIndexs[tableStartIndexs.length-2].endX = i-1;
  47. }
  48. }
  49. }
  50. }
  51. for (let i = 0; i < tableStartIndexs.length; i++) {
  52. parse(data,tableStartIndexs[i],fileName);
  53. }
  54. }
  55. function parse(data,tableInfo,fileName){
  56. let varTypes = [];
  57. let dataList = [];
  58. let NAMESPACE = '';
  59. let CLASSNAME = '';
  60. let FILECOMMENT = '';
  61. let CLASSCOMMENT = '';
  62. let Combine = false;
  63. let varStartX = tableInfo.startX + 1;
  64. //处理定义行
  65. let defineRow = data[tableInfo.startX].slice(tableInfo.startY);
  66. NAMESPACE = defineRow[2]||'Default';
  67. CLASSNAME = defineRow[4]||fileName;
  68. CLASSCOMMENT = defineRow[6]||'';
  69. Combine = defineRow[8]?true:false;
  70. //处理注释行
  71. if(data[tableInfo.startX+1][tableInfo.startY]=='## CCMT'){
  72. let prefix = Combine?' ':'';
  73. FILECOMMENT = `\n${prefix}/**\n`
  74. for(let i=tableInfo.startX+1;i<tableInfo.endX;i++){
  75. if(data[i][tableInfo.startY]=='## VAR'){
  76. varStartX = i;
  77. break;
  78. }
  79. let FILECOMMENTArr = data[i].slice(tableInfo.startY+1);
  80. if(FILECOMMENTArr.length==0) continue;
  81. FILECOMMENT += `${prefix} * `;
  82. let head = FILECOMMENTArr.shift();
  83. FILECOMMENT += head;
  84. if(FILECOMMENTArr.length){
  85. FILECOMMENT += `\n${prefix} * ` + FILECOMMENTArr.join(' ');
  86. }
  87. FILECOMMENT += `\n`;
  88. }
  89. FILECOMMENT += `${prefix} */\n\n`;
  90. }
  91. let keyStatus = {};
  92. //处理Var变量行
  93. let varRow = data[varStartX].slice(tableInfo.startY+1);
  94. for (let i = 0; i < varRow.length; i++) {
  95. let value = varRow[i];
  96. if(value==undefined) break;
  97. if(value.includes('#')){
  98. keyStatus[i] = false;
  99. }else{
  100. keyStatus[i] = true;
  101. }
  102. if(!keyStatus[i]) continue;
  103. let type = {
  104. vname:value,
  105. type:'',
  106. comment:''
  107. }
  108. varTypes[i] = type;
  109. }
  110. // //处理Var变量类型行
  111. for (let i = 0; i < varTypes.length; i++) {
  112. if(!keyStatus[i]) continue;
  113. let value = data[varStartX+1][tableInfo.startY+1+i];
  114. varTypes[i].type = value;
  115. }
  116. //处理Var变量注释行
  117. for (let i = 0; i < varTypes.length; i++) {
  118. if(!keyStatus[i]) continue;
  119. let value = data[varStartX+2][tableInfo.startY+1+i];
  120. if(value!=undefined && value!='') value = value.replace(/\n/g,' ');
  121. varTypes[i].comment = value;
  122. }
  123. //处理数据多行
  124. if(data[varStartX+3] && data[varStartX+3][tableInfo.startY]=='## DATA'){
  125. for (let x = varStartX+3; x <= tableInfo.endX; x++) {
  126. if(data[x].length==0) continue;
  127. let obj = {};
  128. for(let i = 0; i < varTypes.length; i++) {
  129. if(!keyStatus[i]) continue;
  130. let value = data[x][tableInfo.startY+1+i];
  131. if(varTypes[i].type.includes('List')) {
  132. value = value.toString().split(',');
  133. if(varTypes[i].type.includes('int') || varTypes[i].type.includes('float')){
  134. value = value.map((item)=>{
  135. return item * 1;
  136. })
  137. }
  138. }
  139. obj[varTypes[i].vname] = value;
  140. }
  141. dataList.push(obj);
  142. }
  143. //写入JSON文件
  144. if(dataList.length){
  145. const json = JSON.stringify({dataList});
  146. const jsonPath = outputDir + '/json/' + fileName + '.json';
  147. FILE.writeFileSync(jsonPath, json);
  148. }
  149. }
  150. //生成C#类
  151. let ListClass = '';
  152. ListClass += ` [Serializable]\n public class ${CLASSNAME}s {\n`;
  153. ListClass += ` public List<${CLASSNAME}> dataList;\n`;
  154. ListClass += ` }\n\n`;
  155. let Class = ` [Serializable]\n public class ${CLASSNAME} {\n`;
  156. let ClassComment = CLASSCOMMENT?` /// <summary>${CLASSCOMMENT}</summary>\n`:'';
  157. let ClassVar = '';
  158. for (let i = 0; i < varTypes.length; i++) {
  159. if(!varTypes[i]) continue;
  160. ClassVar += ` /// <summary>${varTypes[i].comment}</summary>\n`;
  161. // ClassVar += ` public ${varTypes[i].type} ${varTypes[i].vname} { get; set; }\n`;
  162. ClassVar += ` public ${varTypes[i].type} ${varTypes[i].vname};\n`;
  163. }
  164. let ClassEnd = ` }\n`;
  165. let result;
  166. if(Combine){
  167. result = `\n //----------------------# ${fileName} #----------------------\n`;
  168. result += FILECOMMENT + ClassComment + ListClass + Class + ClassVar + ClassEnd;
  169. if(!NameSpaceCombine[NAMESPACE]) NameSpaceCombine[NAMESPACE] = [];
  170. NameSpaceCombine[NAMESPACE].push(result);
  171. }else{
  172. NameSpace = NameSpaceHead.replace('{NAMESPACE}',NAMESPACE);
  173. result = Head + FILECOMMENT + NameSpace + ClassComment + ListClass + Class + ClassVar + ClassEnd + NameSpaceEnd;
  174. //写入C#文件
  175. const csPath = outputDir + '/cs/' + fileName + '.cs';
  176. FILE.writeFileSync(csPath, result);
  177. }
  178. }