excel转json(多关卡文件案例,字段类型和备注表格)

cocos商店: Cocos Store

使用python3将excel生成json文件

  • 将多个excel文件按照工作表生成json文件,以工作表为一个文件单位
  • 不生成字段,一般用于策划自行备注的信息
  • 不生成工作表,一般用于备份、备注等作用
  • 关卡文件分开excel,比如东京和夏威夷两个大地图的excel文件,里面包含格式一模一样,对应生成两种地图前缀的json

前期准备:

  1. python下载,注意本项目使用3.x版本。或自行百度
  2. pip安装指令pip:安装好python后,建议使用pip,或自行百度
  3. python的表格支持xlrd:pip install xlrd(或自行百度
  4. python的解码支持codecs:pip install codecs(或自行百度
  5. 本案例包含的excel文件

功能说明

1. 字段类型:

类型 标签 格式 生成 备注
数字 number 100 100 普通数字
字符串 string testStr “testStr” 普通文本
一维数组(数字) array1 1|2|3|4 [1,2,3,4] 使用竖线分割
一维数组(字符串) array1string test1|test2|test3|test4 [“test1”,“test2”,“test3”,“test4”] 使用竖线分割
二维数组(数字) array2 1#2|22#32|32#28#32 [[1,2],[22,32],[32,28,32]] 组合间使用竖线分割,组合内使用#分割
二维数组(字符串) array2string te#st4|te#st|te#st7 [[“te”,“st4”],[“te”,“st”],[“te”,“st7”]] 组合间使用竖线分割,组合内使用#分割
不生成 none 随意内容不生成 本字段不生成到json文件,用于在文档里备注等信息

2. 工作表生成

  • 一个工作表对应生成一个同名json文件,但工作表带“_NO”表示不需生成
    案例:《testConfig.xls》文件里包含三个工作表:map、map_NO、shop,对应生成《map.json》《shop.json》两个文件
工作表名 生成文件
map 《map.json》
map_NO 带“_NO”表示不需生成
shop 《shop.json》
  • 对应多个关卡信息表
    文件名包含下划线,表示同类型的文件需要带固定前缀。
    比如《tokyo_东京.xls》《hawaii_夏威夷.xls》,自动截取下横线前部分为生成的json名前缀。
    案例:《tokyo_东京.xls》文件包含的三个工作表:scene、level、res,对应生成《tokyo_scene.json》《tokyo_res.json》《tokyo_level.json》三个文件
工作表名 生成文件
scene 《tokyo_scene.json》
level 《tokyo_level.json》
res 《tokyo_res.json》

使用说明

  1. python3.x环境以及支持引用都准备完毕后,解压下载的压缩包
  2. 修改案例excel表,可改名为任意名字,但注意文件名下划线的特殊用法
  3. 双击《change2json.py》文件执行

修改使用

为了快速将配置生成到项目工程里面,可以修改python代码,删除前面#号注释标记

  1. 注释137行,开启第139行。为配置excel文件的路径,意味着不再是执行本文件夹内的excel,而是"D:\test"目录下:
# 取当前目录
# curPath = os.path.dirname(__file__)
# 取绝对路径目录
curPath = "D:\\test"
print('当前操作路径: %s' % curPath)
  1. 进阶修改,配置和程序不同文件夹,生成后直接将json文件放于程序目标文件夹。文件安排如下(建议使用英文命名文件夹):
|--项目总文件夹
  |--程序项目(代码 Code_your_project)
    |--assets
      |--resources
        |--config (配置生成后存放路径,具体自行修改)
    |--build
    |--library
    |--...
  |--配置(配置excel文件 Config_your_project)
  |--python工具
    |--配置工具(py脚本放置的文件夹)

第136行后面代码删除,粘贴以下代码覆盖。

注意两个路径需要改名:Config_your_project、Code_your_project

 
# 取当前目录
curPath = os.path.dirname(__file__)
 
print('当前所在路径: %s' % curPath)
#上上层目录路径
upperDir = os.path.abspath(os.path.join(os.getcwd(), "../.."))
print('项目路径: %s' % upperDir)

configsPath = upperDir + "\\Config_your_project)"
print('配置路径: %s' % configsPath)

projectPath = upperDir + "\\Code_your_project\\assets\\resources\\configs\\"
print('程序工程路径: %s' % projectPath)
# 判断文件夹是否存在决定建不建文件夹
isExists = os.path.exists(projectPath)
if not isExists:
    os.makedirs(projectPath)

# 遍历当前目录查询出所有的excel表
fileNameList = os.listdir(configsPath)
print(fileNameList)


for a in fileNameList:
    print("获得文件:%s"%(a))
    # 这里只能读取xlsx的表 如果是其他的表请加入判断
    extName = os.path.splitext(a)
    # 剔除缓存的表
    if(extName[0].find("~") >= 0 or extName[0].find("$") >= 0):
        continue
    # 只有这三种格式的才转 其他的不管
    if(extName[1] == '.xlsx' or extName[1] == ".csv" or extName[1] == ".xls"):
        data = xlrd.open_workbook(configsPath+'\\'+a)
        # print("读取sheet名字:%s"%(data.sheet_names()))
        for sheetName in data.sheet_names():
            
            if(sheetName.find("_NO") >= 0):
                # _NO标记不生成的表
                continue

            table = data.sheet_by_name(sheetName)
            # print("读取sheet获得table:%s"%(table))

            if( "_" in a) :
                #局内场景配置,需要输出固定名字
                sceneName = a.split("_")
                table2json(table, sceneName[0]+"_"+sheetName+'.json', projectPath)
            else :
                table2json(table, sheetName+'.json', projectPath)

print("所有的表转换完成")
input('Press Enter to exit...')

备注

  • 建议直接复制案例excel文件进行修改,防止因为不同版本导致错误(如wps和office不同,xls和xlsx不同等)
  • 开发者技术支持邮箱:eddy_liangwei@qq.com
  • 其它版本期望:
  1. 指定生成客户端还是服务端的配置,C/S、C、S三种类型的文件夹放置
  2. 语言翻译使用另外导出路径,用于不同语言bundle的切换
  3. :heavy_check_mark: 配置版本控制,策划编辑后双击脚本,即可完成生成并自动累加版本号,而后提交到服务器。程序包每次启动进行检测本地(缓存localStrong)配置和服务器版本对应更新,需更新则进行简单加密保存本地
  4. :heavy_check_mark: 配置打包类型,debug或者release等,对应生成在其文件夹。双击py,询问打包类型选择,对应发布到文件夹。同时配合上面3号功能,实现打包不同需求的配置

客户端如果用json的话,大概率都是转成对象,所以如果再加个d.ts给代码提示用那就更好啦(如果有了就当我没说)

所以我直接转成ts的哈哈

点赞。转ts的做法也用过。
不过这次上传的主要是为了备注里面的:3、4。
方便做一个动态的配置,给策划那边一种“配置热更”的修改包。

我实际应用,是直接给一个类。因为d.ts没研究过~~

/*局内对象配置/
export class SceneObjVo {
/*编号/
public id: number;

/**名字*/
public name: string;

}

Snipaste_2023-12-06_11-21-49 Snipaste_2023-12-06_11-27-03 Snipaste_2023-12-06_11-42-27