|
@@ -0,0 +1,197 @@
|
|
|
+const FILE = require('fs-extra');
|
|
|
+const XLSX = require('node-xlsx');
|
|
|
+
|
|
|
+//读取excel目录所有excel文件
|
|
|
+const files = FILE.readdirSync('./excel');
|
|
|
+const outputDir = './output';
|
|
|
+
|
|
|
+//清除输出目录
|
|
|
+FILE.emptyDirSync(outputDir);
|
|
|
+
|
|
|
+//创建JSON目录
|
|
|
+FILE.ensureDirSync(outputDir + '/json');
|
|
|
+//创建C#目录
|
|
|
+FILE.ensureDirSync(outputDir + '/cs');
|
|
|
+
|
|
|
+let Head = `using System;\nusing System.Collections.Generic;\nusing UnityEngine;\n`;
|
|
|
+let NameSpaceHead = `namespace {NAMESPACE} {\n`;
|
|
|
+let NameSpaceEnd = `}\n`;
|
|
|
+let NameSpaceCombine = {};
|
|
|
+
|
|
|
+//遍历所有excel文件
|
|
|
+for (let i = 0; i < files.length; i++) {
|
|
|
+ const filePath = './excel/' + files[i];
|
|
|
+ const result = convert(filePath);
|
|
|
+}
|
|
|
+Object.keys(NameSpaceCombine).forEach((key)=>{
|
|
|
+ let namespace = key;
|
|
|
+ let content = NameSpaceCombine[key].join('\n');
|
|
|
+ let NameSpace = NameSpaceHead.replace('{NAMESPACE}',namespace);
|
|
|
+ let ret = Head + NameSpace + content + NameSpaceEnd;
|
|
|
+ FILE.writeFileSync(outputDir + '/cs/' + namespace + '.cs', ret);
|
|
|
+});
|
|
|
+console.log('转换完成');
|
|
|
+
|
|
|
+function convert(filePath) {
|
|
|
+ //获取文件名,删除后缀并大写首字符
|
|
|
+ let fileName = filePath.split('/')[2].split('.')[0];
|
|
|
+ // const className = fileName.charAt(0).toUpperCase() + fileName.slice(1);
|
|
|
+ fileName = fileName.charAt(0).toUpperCase() + fileName.slice(1);
|
|
|
+
|
|
|
+ const workSheetsFromFile = XLSX.parse(filePath);
|
|
|
+ const data = workSheetsFromFile[0].data;
|
|
|
+ // console.log(data)
|
|
|
+ let tableStartIndexs = [];
|
|
|
+
|
|
|
+ for (let i = 0; i < data.length; i++) {
|
|
|
+ for (let j = 0; j < data[i].length; j++) {
|
|
|
+ if(data[i][j] === '###') {
|
|
|
+ let startX = i;
|
|
|
+ let startY = j;
|
|
|
+ let endX = data.length-1;
|
|
|
+ tableStartIndexs.push({startX,startY,endX});
|
|
|
+ if(tableStartIndexs.length>1){
|
|
|
+ tableStartIndexs[tableStartIndexs.length-2].endX = i-1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ for (let i = 0; i < tableStartIndexs.length; i++) {
|
|
|
+ parse(data,tableStartIndexs[i],fileName);
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+function parse(data,tableInfo,fileName){
|
|
|
+ let varTypes = [];
|
|
|
+ let dataList = [];
|
|
|
+ let NAMESPACE = '';
|
|
|
+ let CLASSNAME = '';
|
|
|
+ let FILECOMMENT = '';
|
|
|
+ let CLASSCOMMENT = '';
|
|
|
+ let Combine = false;
|
|
|
+
|
|
|
+ let varStartX = tableInfo.startX + 1;
|
|
|
+
|
|
|
+ //处理定义行
|
|
|
+ let defineRow = data[tableInfo.startX].slice(tableInfo.startY);
|
|
|
+ NAMESPACE = defineRow[2]||'Default';
|
|
|
+ CLASSNAME = defineRow[4]||fileName;
|
|
|
+ CLASSCOMMENT = defineRow[6]||'';
|
|
|
+ Combine = defineRow[8]?true:false;
|
|
|
+
|
|
|
+ //处理注释行
|
|
|
+ if(data[tableInfo.startX+1][tableInfo.startY]=='## CCMT'){
|
|
|
+ let prefix = Combine?' ':'';
|
|
|
+ FILECOMMENT = `\n${prefix}/**\n`
|
|
|
+ for(let i=tableInfo.startX+1;i<tableInfo.endX;i++){
|
|
|
+ if(data[i][tableInfo.startY]=='## VAR'){
|
|
|
+ varStartX = i;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ let FILECOMMENTArr = data[i].slice(tableInfo.startY+1);
|
|
|
+ if(FILECOMMENTArr.length==0) continue;
|
|
|
+ FILECOMMENT += `${prefix} * `;
|
|
|
+ let head = FILECOMMENTArr.shift();
|
|
|
+ FILECOMMENT += head;
|
|
|
+ if(FILECOMMENTArr.length){
|
|
|
+ FILECOMMENT += `\n${prefix} * ` + FILECOMMENTArr.join(' ');
|
|
|
+ }
|
|
|
+ FILECOMMENT += `\n`;
|
|
|
+ }
|
|
|
+ FILECOMMENT += `${prefix} */\n\n`;
|
|
|
+ }
|
|
|
+
|
|
|
+ let keyStatus = {};
|
|
|
+ //处理Var变量行
|
|
|
+ let varRow = data[varStartX].slice(tableInfo.startY+1);
|
|
|
+ for (let i = 0; i < varRow.length; i++) {
|
|
|
+ let value = varRow[i];
|
|
|
+ if(value==undefined) break;
|
|
|
+
|
|
|
+ if(value.includes('#')){
|
|
|
+ keyStatus[i] = false;
|
|
|
+ }else{
|
|
|
+ keyStatus[i] = true;
|
|
|
+ }
|
|
|
+ if(!keyStatus[i]) continue;
|
|
|
+ let type = {
|
|
|
+ vname:value,
|
|
|
+ type:'',
|
|
|
+ comment:''
|
|
|
+ }
|
|
|
+
|
|
|
+ varTypes[i] = type;
|
|
|
+ }
|
|
|
+ // //处理Var变量类型行
|
|
|
+ for (let i = 0; i < varTypes.length; i++) {
|
|
|
+ if(!keyStatus[i]) continue;
|
|
|
+ let value = data[varStartX+1][tableInfo.startY+1+i];
|
|
|
+ varTypes[i].type = value;
|
|
|
+ }
|
|
|
+ //处理Var变量注释行
|
|
|
+ for (let i = 0; i < varTypes.length; i++) {
|
|
|
+ if(!keyStatus[i]) continue;
|
|
|
+ let value = data[varStartX+2][tableInfo.startY+1+i];
|
|
|
+ if(value!=undefined && value!='') value = value.replace(/\n/g,' ');
|
|
|
+ varTypes[i].comment = value;
|
|
|
+ }
|
|
|
+ //处理数据多行
|
|
|
+ if(data[varStartX+3] && data[varStartX+3][tableInfo.startY]=='## DATA'){
|
|
|
+ for (let x = varStartX+3; x <= tableInfo.endX; x++) {
|
|
|
+ if(data[x].length==0) continue;
|
|
|
+ let obj = {};
|
|
|
+ for(let i = 0; i < varTypes.length; i++) {
|
|
|
+ if(!keyStatus[i]) continue;
|
|
|
+ let value = data[x][tableInfo.startY+1+i];
|
|
|
+ if(varTypes[i].type.includes('List')) {
|
|
|
+ value = value.toString().split(',');
|
|
|
+ if(varTypes[i].type.includes('int') || varTypes[i].type.includes('float')){
|
|
|
+ value = value.map((item)=>{
|
|
|
+ return item * 1;
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }
|
|
|
+ obj[varTypes[i].vname] = value;
|
|
|
+ }
|
|
|
+ dataList.push(obj);
|
|
|
+ }
|
|
|
+ //写入JSON文件
|
|
|
+ if(dataList.length){
|
|
|
+ const json = JSON.stringify({dataList});
|
|
|
+ const jsonPath = outputDir + '/json/' + fileName + '.json';
|
|
|
+ FILE.writeFileSync(jsonPath, json);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //生成C#类
|
|
|
+ let ListClass = '';
|
|
|
+ ListClass += ` [Serializable]\n public class ${CLASSNAME}s {\n`;
|
|
|
+ ListClass += ` public List<${CLASSNAME}> dataList;\n`;
|
|
|
+ ListClass += ` }\n\n`;
|
|
|
+
|
|
|
+ let Class = ` [Serializable]\n public class ${CLASSNAME} {\n`;
|
|
|
+ let ClassComment = CLASSCOMMENT?` /// <summary>${CLASSCOMMENT}</summary>\n`:'';
|
|
|
+ let ClassVar = '';
|
|
|
+ for (let i = 0; i < varTypes.length; i++) {
|
|
|
+ if(!varTypes[i]) continue;
|
|
|
+ ClassVar += ` /// <summary>${varTypes[i].comment}</summary>\n`;
|
|
|
+ // ClassVar += ` public ${varTypes[i].type} ${varTypes[i].vname} { get; set; }\n`;
|
|
|
+ ClassVar += ` public ${varTypes[i].type} ${varTypes[i].vname};\n`;
|
|
|
+ }
|
|
|
+ let ClassEnd = ` }\n`;
|
|
|
+ let result;
|
|
|
+ if(Combine){
|
|
|
+ result = `\n //----------------------# ${fileName} #----------------------\n`;
|
|
|
+ result += FILECOMMENT + ClassComment + ListClass + Class + ClassVar + ClassEnd;
|
|
|
+ if(!NameSpaceCombine[NAMESPACE]) NameSpaceCombine[NAMESPACE] = [];
|
|
|
+ NameSpaceCombine[NAMESPACE].push(result);
|
|
|
+ }else{
|
|
|
+ NameSpace = NameSpaceHead.replace('{NAMESPACE}',NAMESPACE);
|
|
|
+ result = Head + FILECOMMENT + NameSpace + ClassComment + ListClass + Class + ClassVar + ClassEnd + NameSpaceEnd;
|
|
|
+ //写入C#文件
|
|
|
+ const csPath = outputDir + '/cs/' + fileName + '.cs';
|
|
|
+ FILE.writeFileSync(csPath, result);
|
|
|
+ }
|
|
|
+}
|