如何通过代码修改资源文件后缀 .xlsx改为.bin

利用jszip库写了一个excel2json的解析工具 但是需要手动把.xlsx文件后缀更改为.bin才能加载到数据从而进一步解析
如题 怎样才能通过代码直接修改资源文件后缀 cc.path.changeExtname这个api只能处理字符串而不能实际操作文件

1赞

通常不是用转表工具把表格转成json之后再放到项目里使用的,有这种在项目里直接转excel表的需求吗

因为本人就是策划 太懒了 想直接把excel丢进去解析 现在连手动把.xlsx后缀改为.bin都不想改 问问看有没有通过代码修改的方法

Cocos Creator 3.8 手册 - 下载与解析
通过这个可以自定义加载方式, 只要让 xlsx 加载方式和 bin 一样就行

是不是2.4.x也有 谢谢 明天我试一下

感谢老哥 搞定了!

    /**
     * 注册自定义资源格式加载处理方式方法
     */
    private _registerHandlers() {
        //拓展.xlsx格式文件加载(但无法像加载.bin格式文件一样获得cc.BufferAsset资源而是获得cc.Asset资源)
        cc.assetManager.downloader.register('.xlsx', cc.assetManager.downloader['_downloaders']['.bin']);
    }

剩下就是正常通过加载到的asset资源的[’_nativeAsset’]属性拿到ArrayBuffer数据 再给JSZip反序列化 excel.bin解析xml2json数据部分之前就写好了

现在终于可以直接把.xlsx文件放到项目里使用了 数据直接在excel里维护可比每次都导出一遍json方便多了 :yum:

确实方便了。然后文件也大了。不可预料的情况也多了,别人想看配置表也方便多了 :+1:

需求不同哈 测试环境下调整数值用

根据你的思路,我写了个逻辑,是管用的,谢谢。

我的excel在Resources里面,取这个excel路径的方法不太优雅。不知道大家有什么更好的方法。当然了,如果能直接获得excel的绝对路径直接调xlsx.readFile方法就更好了。

import * as xlsx from "xlsx"

    start() 
    {
        assetManager.downloader.register('.xlsx', assetManager.downloader['_downloaders']['.bin']);
        resources.load("Data/Excel/TableMultiLanguage", (error: Error, asset) =>
        {
            console.log(asset.nativeUrl);
            assetManager.loadAny({ url: asset.nativeUrl }, (error: Error, asset) =>
            {
                console.log(asset);
                const workbook: xlsx.WorkBook = xlsx.readFile(asset);
                const sheetName: string = workbook.SheetNames[0];
                const sheetData: xlsx.WorkSheet = workbook.Sheets[sheetName];
                const json = xlsx.utils.sheet_to_json(sheetData);
                console.log(json);
            });
        });
    }
assetManager.downloader.register('.xlsx', assetManager.downloader['_downloaders']['.bin']);
resources.load('Data/Excel/TableMultiLanguage', (err, asset) => {
    const workbook: xlsx.WorkBook = xlsx.readFile(asset['_nativeAsset']);
    const sheetName: string = workbook.SheetNames[0];
    const sheetData: xlsx.WorkSheet = workbook.Sheets[sheetName];
    const json = xlsx.utils.sheet_to_json(sheetData);
});

这样子就好了 按.bin格式加载.xlsx文件 然后asset['_nativeAsset']拿到的就是arrayBuffer数据

loadAny接口实在不喜欢用 感觉有点太底层了 所以我都是封装的自己能掌握的api

另外nativeUrl不用加载资源也可以拿到 可以通过uuid转换得到 用到了两个api分别是resources.getInfoWithPathassetManager.utils.getUrlWithUuid

/**

     * 获取资源信息方法

     * @param url 在AB资源包文件夹下的资源文件定位

     * @param ext 资源文件后缀名(默认为.png)

     * @param type asset资源类型

     * @returns 返回一个包含资源uuid path ctor nativeUrl信息的对象

     */

    function getAssetInfo(url: string, ext: string = '.png', type?: typeof cc.Asset): { uuid: string, path: string, ctor: typeof cc.Asset, nativeUrl: string } {

        //根据路径获取资源信息

        let { uuid, path, ctor } = cc.assetManager.getBundle(hh.tools.cutUrl(url).dir).getInfoWithPath(hh.tools.cutUrl(url).path, type);

        //uuid转nativeUrl

        let nativeUrl: string = cc.assetManager.utils.getUrlWithUuid(uuid, { isNative: true, native: '.json' }).replace(/\.json$/, ext);

        //返回资源信息

        return { uuid, path, ctor, nativeUrl };

    }
1赞

可行的!非常感谢。