利用jszip库写了一个excel2json的解析工具 但是需要手动把.xlsx文件后缀更改为.bin才能加载到数据从而进一步解析
如题 怎样才能通过代码直接修改资源文件后缀 cc.path.changeExtname这个api只能处理字符串而不能实际操作文件
1赞
通常不是用转表工具把表格转成json之后再放到项目里使用的,有这种在项目里直接转excel表的需求吗
因为本人就是策划 太懒了 想直接把excel丢进去解析 现在连手动把.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方便多了 
确实方便了。然后文件也大了。不可预料的情况也多了,别人想看配置表也方便多了 
需求不同哈 测试环境下调整数值用
根据你的思路,我写了个逻辑,是管用的,谢谢。
我的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.getInfoWithPath和assetManager.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赞
可行的!非常感谢。