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{ 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?` /// ${CLASSCOMMENT}\n`:''; let ClassVar = ''; for (let i = 0; i < varTypes.length; i++) { if(!varTypes[i]) continue; ClassVar += ` /// ${varTypes[i].comment}\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); } }