项目背景:cocos create3.x 游戏 要用到 Excel 配置表: 轮子没找到自己操了:
主要分两部分:
- 做一个打表工具,应为每次都是点 Excel 导出 csv 不能导出多个 sheets, 而且还要手动设置 编码,
- cocos create 解析;
Excel 打表工具的制作:
这个是我的 Excel: 第一行字段,第二行描述
这个是我导出的 .csv 文件:
工具使用 C# 写的,使用了 Aspose.Cells 库,(没有水印 没有注释)
应为使用了 Aspose 库,所以代码很简单:
using Aspose.Cells; using System; using System.IO; namespace ExcelToCSV { class Program { static void Main(string[] args) { Console.WriteLine(@"正在运行......"); Workbook ExportExcelToCSVWorkBook = new Workbook(@"..\游戏配置.xlsx"); WorksheetCollection myColection = ExportExcelToCSVWorkBook.Worksheets; for (int i = 0; i < myColection.Count; i++) { Console.WriteLine("sheets name:" + myColection[i].Name); string sheetsName = myColection[i].Name.Replace(" ", ""); ExportExcelToCSVWorkBook.Worksheets.ActiveSheetIndex = i; switch (sheetsName) { case "卡牌": SaveFile(ExportExcelToCSVWorkBook, "board"); break; case "卡牌效果": SaveFile(ExportExcelToCSVWorkBook, "boardEffect"); break; case "角色": SaveFile(ExportExcelToCSVWorkBook, "character"); break; case "装备": SaveFile(ExportExcelToCSVWorkBook, "equip"); break; case "坐骑": SaveFile(ExportExcelToCSVWorkBook, "mount"); break; } } Console.WriteLine(@"运行结束!按任意键结束"); Console.ReadKey(); } static void SaveFile(Workbook workbook, string name) { string path = String.Format(@"{0}\{1}", Directory.GetParent(Directory.GetCurrentDirectory()), "out"); if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } workbook.Save(String.Format(@"{0}\{1}.csv", path, name), SaveFormat.CSV); } } }
cocos create 中 解析csv:
cocos create3.x 已经 提供了TextAsset,可以在 Resources 目录中加载 文本;
async loadResources(name: string) { return await new Promise<Array<any>>((resolve) => { resources.load(`configs/${name}`, (err: any, res: TextAsset) => { if (err) { console.log(`资源加载失败 ${name}:`, err); return resolve([]); } else { resolve(this.CSVToArray(res.text)); } }) }); }
这里是解析:(解析这里需要注意下 我们的 .csv 文本文件)
- 第一行是我们的字段,第二行是我们的描述,也就是注释
- 第三行 才是正正的 数据
/** * CSBV 转 数组对象 * @param text 文本资源内容 * @returns */ CSVToArray(text) { let str = text.replace(/\r/g, ""); let mapArr = str.split("\n"); let array = []; let datumArray = []; let arr = ''; for (let index = 0; index < mapArr.length; index++) { //const element = mapArr[index]; arr = mapArr[index].split(","); array[index] = arr; } if (array.length > 1) { let datumItem = {}; for (let i = 2; i < array.length; i++) { datumItem = {} for (let j = 0; j < array[0].length; j++) { if (array[i][j]) { datumItem[array[0][j]] = array[i][j]; } else { continue; } } if (Object.keys(datumItem).length > 0) { datumArray.push(datumItem) } } } return datumArray }
那么解析出来的数据就张这样了:
这里是完整脚本:
import { resources, TextAsset } from "cc"; import { BaseSingleton } from "../base/BaseSingleton"; import { Log } from "../utils/Log"; export class GlobeConfig extends BaseSingleton { /** * 牌组 */ private _arrayBoard: Array<any>; /** * 牌组 效果 */ private _arrayBoardEffect: Array<any>; /** * 角色 */ private _arrayCharacter: Array<any>; /** * 装备 */ private _arrayEquip: Array<any>; /** * 坐骑 */ private _arrayMount: Array<any>; // private parser = csv.parse({ delimiter: ','}); async initConfig() { this._arrayBoard = await this.loadResources('board'); this._arrayBoardEffect = await this.loadResources('boardEffect'); this._arrayCharacter = await this.loadResources('character'); this._arrayEquip = await this.loadResources('equip'); this._arrayMount = await this.loadResources('mount'); } async loadResources(name: string) { return await new Promise<Array<any>>((resolve) => { resources.load(`configs/${name}`, (err: any, res: TextAsset) => { if (err) { console.log(`资源加载失败 ${name}:`, err); return resolve([]); } else { resolve(this.CSVToArray(res.text)); } }) }); } /** * 牌组 */ public get ArrayBoard(): Array<any> { return this._arrayBoard } /** * 牌组 效果 */ public get ArrayBoardEffect(): Array<any> { return this._arrayBoardEffect } /** * 牌组 角色 */ public get ArrayCharacter(): Array<any> { return this._arrayCharacter } /** * 装备 */ public get ArrayEquip(): Array<any> { return this._arrayEquip } /** * 坐骑 */ public get ArrayMount(): Array<any> { return this._arrayMount } /** * CSBV 转 数组对象 * @param text 文本资源内容 * @returns */ CSVToArray(text) { let str = text.replace(/\r/g, ""); let mapArr = str.split("\n"); let array = []; let datumArray = []; let arr = ''; for (let index = 0; index < mapArr.length; index++) { //const element = mapArr[index]; arr = mapArr[index].split(","); array[index] = arr; } if (array.length > 1) { let datumItem = {}; for (let i = 2; i < array.length; i++) { datumItem = {} for (let j = 0; j < array[0].length; j++) { if (array[i][j]) { datumItem[array[0][j]] = array[i][j]; } else { continue; } } if (Object.keys(datumItem).length > 0) { datumArray.push(datumItem) } } } return datumArray } }