cocos create csv 配置文件

项目背景:cocos create3.x    游戏 要用到 Excel 配置表: 轮子没找到自己操了:

主要分两部分:

  1. 做一个打表工具,应为每次都是点 Excel 导出 csv 不能导出多个 sheets,  而且还要手动设置 编码,
  2. 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
    }
}

猜你喜欢

转载自blog.csdn.net/nicepainkiller/article/details/127423477