基于 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 openpyxlWindows:
# 安装 Python 时勾选"Add to PATH",然后在 CMD 中执行:
pip install openpyxl项目自带示例 Excel 文件(config_excel/ 目录下),以及对应的导出结果(config_excel/server/ 和 config_excel/client/)。
Windows:
genCfgs.batLinux/macOS:
bash genCfgs.sh执行后即可在 config_excel/server/ 和 config_excel/client/ 查看生成效果。
python src/genCfgs.py [参数]
| 参数 | 说明 |
|---|---|
--input |
需要扫描的 Excel 文件目录 |
--writer |
可重复填写,格式:writer:类型:目录。类型 支持 srv/server 和 cli/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参数指定导出目标。
格式:MMM-NNN.xlsx 或 MMM--NNN.xlsx
MMM:任意描述性字符(常用中文),不以下划线结尾,仅作为注释,不影响导出。NNN:只能包含字母、数字、下划线,且不能以数字或下划线开头,作为导出文件名前缀。
示例:A_array表示例--cfg_array.xlsx → 导出前缀为 cfg_array
| 格式 | 导出文件名 | 说明 |
|---|---|---|
描述-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(如备注页)。
每行为一条数据记录,适合技能、装备、关卡等多行配置。
第2行A列(A2)必须填写 array(标识此表为 array 模式)。
| 行号 | 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行)必须连续填写,遇到空单元格即停止解析后续列。
- 字段名为空表示该列不导出到对应端(服务端或客户端)。
array 模式支持将某列设为索引 Key(用于生成 Erlang HRL 等需要 Key 的格式)。
在第4行(server)或第5行(client)的字段名前加 $key_ 前缀即可,例如:$key_id。
- 导出时该字段名为
id(去掉前缀)。 - 支持多个 Key 字段,按出现顺序作为多级 Key。
行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
整张表只有一个"对象",每行为一个 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,配置时需注意。
列: 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}} |
list、dict、json 三种类型可以任意嵌套。
部署时可将工具打包为独立 exe,无需在目标机器安装 Python:
pip install pyinstaller
cd src
pyinstaller -F -c --paths=. genCfgs.py生成的 genCfgs.exe 在 src/dist/ 目录中。
- string 类型中无法直接使用换行符,请用
\n等转义字符替代。 - xml 和 jsonarray 不支持数字作为 key(如 dict 的 key、object 模式的字段名),配置时需确保 key 为字符串,否则导出会报错。
- xml 本身不支持数组结构,不建议用于数组数据较多的表。
- 工具通过检测 sheet 中的
server/client标识决定是否导出该 sheet,没有这两个标识的 sheet(如备注页)会被自动跳过。 - 以
~、.、$开头的 Excel 文件(临时文件)会被自动跳过。 - 类型列/行必须连续填写,中间出现空单元格即视为后续字段不再导出。
- 出错时日志会提示
DOC、SHEET、ROW、COLUMN,方便定位问题。