123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197 |
- 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);
- }
- }
|