Skip to content

ErlGameWorld/genCfgs

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

19 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

genCfgs

基于 Python3 + openpyxl 的 xlsx 配置导表工具。支持将 Excel 表格导出为 Erlang、Elixir、Lua、JSON、XML、Python 等格式的配置文件。

openpyxl 文档:https://pypi.python.org/pypi/openpyxl


目录


安装依赖

推荐 Python 3.53.10(pyinstaller 打包请使用 3.53.7)。

Linux:

apt-get install python-pip
pip install openpyxl

Windows:

# 安装 Python 时勾选"Add to PATH",然后在 CMD 中执行:
pip install openpyxl

快速开始

项目自带示例 Excel 文件(config_excel/ 目录下),以及对应的导出结果(config_excel/server/config_excel/client/)。

Windows:

genCfgs.bat

Linux/macOS:

bash genCfgs.sh

执行后即可在 config_excel/server/config_excel/client/ 查看生成效果。


命令行参数

python src/genCfgs.py [参数]
参数 说明
--input 需要扫描的 Excel 文件目录
--writer 可重复填写,格式:writer:类型:目录类型 支持 srv/servercli/client
--srv 服务端配置文件输出目录(不填则不导出服务端)
--cli 客户端配置文件输出目录(不填则不导出客户端)
--timeout 仅处理最后修改时间在 N 秒以内的文件;-1 表示处理全部文件
--suffix Excel 文件后缀过滤,通常为 .xlsx;不填则处理目录下所有文件

可用 writer:erlanghrl erlangerl elixir lua jsonarray jsonobject xml python

示例:

:: 一条命令同时导出服务端 hrl、服务端 erl、客户端 lua
python src/genCfgs.py --input ./config_excel --timeout -1 --suffix .xlsx --writer erlanghrl:srv:./config_excel/server/include/ --writer erlangerl:srv:./config_excel/server/config/ --writer lua:cli:./config_excel/client/

:: 仅导出服务端 JSON(不导出客户端)
python src/genCfgs.py --input ./config_excel --timeout -1 --suffix .xlsx --writer jsonarray:srv:./config_excel/server/

推荐使用可重复的 --writer 参数指定导出目标。


文件与 Sheet 命名规则

Excel 文件名

格式:MMM-NNN.xlsxMMM--NNN.xlsx

  • MMM:任意描述性字符(常用中文),不以下划线结尾,仅作为注释,不影响导出。
  • NNN只能包含字母、数字、下划线,且不能以数字或下划线开头,作为导出文件名前缀。

示例:A_array表示例--cfg_array.xlsx → 导出前缀为 cfg_array

Sheet 名

格式 导出文件名 说明
描述-XXX NNN_XXX.lang 一个 Excel 含多个需要导出的 sheet 时用
描述+XXX NNN_XXX.lang 同上(+- 效果相同)
描述(无符号) NNN.lang 一个 Excel 只有一个导出 sheet 时用

lang 为目标语言对应的文件后缀(.lua.erl.json 等)。

示例:sheet 名 示例2+example2,Excel 前缀 cfg_array → 导出为 cfg_array_example2.lua

工具会跳过不包含 server/client 标识的 sheet(如备注页)。


配置表结构:两种模式

array 模式(行数据表)

每行为一条数据记录,适合技能、装备、关卡等多行配置。

第2行A列(A2)必须填写 array(标识此表为 array 模式)。

头部行结构(共 5 行)

行号 A 列(第1列) B 列起(第2列起,每列一个字段)
第1行 整行为全局注释,不导出
第2行 array必填,表类型标识) 各字段的注释(可选,用于生成文件注释)
第3行 slist/clist(可选,见下) 各字段的数据类型(必填)
第4行 server必填 各字段的服务端字段名(不导出则留空)
第5行 client必填 各字段的客户端字段名(不导出则留空)
第6行起 实际数据行
  • 第3行 A 列(slist/clist):填 slist 则服务端额外导出 get_list() 函数,填 clist 则客户端同理,可同时填 slist clist,不需要则留空。
  • 类型列(第3行)必须连续填写,遇到空单元格即停止解析后续列。
  • 字段名为空表示该列不导出到对应端(服务端或客户端)。

Key 字段

array 模式支持将某列设为索引 Key(用于生成 Erlang HRL 等需要 Key 的格式)。

在第4行(server)或第5行(client)的字段名前加 $key_ 前缀即可,例如:$key_id

  • 导出时该字段名为 id(去掉前缀)。
  • 支持多个 Key 字段,按出现顺序作为多级 Key。

示例头部(array 模式)

行1: [全局注释]                                                               ← 整行不导出
行2: array          [英雄id注释]  [英雄名字注释]  [合成消耗注释]  [属性注释]  ...   ← 注释行
行3: slist          number        string          lua             list        ...   ← 类型行
行4: server         $key_id       name            material        attr        ...   ← server 字段名(id列加$key_前缀作为Key)
行5: client         $key_id       name            material        attr        ...   ← client 字段名
行6: [数据]         1             examp1001       {...}           [...]       ...

注:行2是注释行,行3是类型行,行4是server字段名行,行5是client字段名行,行6起是数据。请以源码中的常量为准: ACMT_ROW=2, ATPE_ROW=3, ASRV_ROW=4, ACLI_ROW=5


object 模式(KV 配置表)

整张表只有一个"对象",每行为一个 key-value 字段。适合活动开关、全局参数等单条配置。

第2行A列(A2)必须填写 object

源码常量:SHEET_FLAG_ROW=2, SHEET_FLAG_COL=1,即第2行第1列填 object

头部列结构

列号 第2行(标题行) 第3行起(每行一个字段)
A列(第1列) object必填 各字段的注释(可选)
B列(第2列) 各字段的数据类型(必填)
C列(第3列) server必填 各字段的服务端字段名(不导出则留空)
D列(第4列) client必填 各字段的客户端字段名(不导出则留空)
E列(第5列) 各字段的数据值(必填)
  • 类型列(B列)必须连续填写,遇到空单元格即停止解析。
  • 字段名支持数字(如 10000),但导出为 xml 或 jsonarray 时不支持数字作为 key,配置时需注意。

示例头部(object 模式)

列:      A(注释)       B(类型)   C/server字段名    D/client字段名   E(值)
第1行:   [整行注释]      —          —                 —               —
第2行:   object          —          server            client          —
第3行:   开放等级         int        open_level        open_level      90
第4行:   额外属性值1      number     add_value1        add_value1      100.1
第5行:   活动id           int        act_id            actId           1001
第6行:   开始时间         string     open              open            18:00:0
第7行:   错误信息         string     10000             —               前面字段为errorID...
...

object 模式没有"多行数据",只有字段定义。server/client 标识写在第2行的第3、4列。


支持的数据类型

类型名 说明 示例
int 64 位整数 1, 1000, -5
int64 int(兼容别名) 9999999999
number 浮点数(整数小数均可) 3.14, 100
string 字符串,填写时不需要加引号 hello, 18:00:0
tuple Python 元组,元素可为任意基础类型 (1, 2, 3)
list Python 列表,元素可互相嵌套 [1, 2, [3, 4]]
dict Python 字典,key 可为 int/number/string/tuple;注意:xml 和 jsonarray 不支持数字 key {1: 100, 2: 200}
json JSON 对象,key 必须为字符串,value 可为任意 JSON 类型 {"id": 1, "name": "test"}
lua Lua table 格式 {1, {res=1, id=10001, count=1}}

listdictjson 三种类型可以任意嵌套


打包为 exe

部署时可将工具打包为独立 exe,无需在目标机器安装 Python:

pip install pyinstaller
cd src
pyinstaller -F -c --paths=. genCfgs.py

生成的 genCfgs.exesrc/dist/ 目录中。


注意事项

  • string 类型中无法直接使用换行符,请用 \n 等转义字符替代。
  • xml 和 jsonarray 不支持数字作为 key(如 dict 的 key、object 模式的字段名),配置时需确保 key 为字符串,否则导出会报错。
  • xml 本身不支持数组结构,不建议用于数组数据较多的表。
  • 工具通过检测 sheet 中的 server/client 标识决定是否导出该 sheet,没有这两个标识的 sheet(如备注页)会被自动跳过。
  • ~.$ 开头的 Excel 文件(临时文件)会被自动跳过。
  • 类型列/行必须连续填写,中间出现空单元格即视为后续字段不再导出。
  • 出错时日志会提示 DOCSHEETROWCOLUMN,方便定位问题。

About

基于openpyxl的excel转换工具。支持xlsx文件转换为erlang,elixir,lua,json,xml,python等配置文件

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors