Excel转JSON:高效游戏开发数据转换指南
文章摘要
Excel2Json工具将Excel表格转换为JSON格式,常用于游戏配置等数据驱动场景。主流开源工具包括zwcloud/Excel2Json(支持批量导出)、Configer(多格式支持)和TableExportTool(Unity友好)。核心原理是将Excel的Sheet转为JSON数组/对象,首行为字段名,后续为数据。Python可通过openpyxl库实现基础转换,进阶功能包括类型标注、注释行和多表关联。典型工作流是策划编辑Excel后一键导出JSON供程序使用,实现高效数据管理。
1. Excel2Json的基本原理
- 输入:Excel文件(.xls/.xlsx),每个Sheet为一张配置表,第一行为字段名,第二行为类型(可选),第三行起为数据。
- 输出:JSON文件,每个Sheet导出一个JSON,结构为数组或对象。
- 用途:游戏配置表、数据驱动系统、前后端共享数据等。
2. 常用Excel2Json工具/开源项目
2.1 推荐开源项目
- Excel2Json(zwcloud版)
- 支持类型标注、注释、批量导出、命令行、Python实现。
- Configer
- 支持Excel导出多格式(JSON、CSV、二进制)、多语言代码生成、复杂结构。
- TableExportTool
- Unity友好,支持多格式导出、自动代码生成。
2.2 其他工具
- excel2json-3
- Node.js实现,支持命令行批量转换。
- excel2json
- 轻量级Node.js工具。
3. 简单实现(Python版)
假设你的Excel表结构如下:
3.1 安装依赖
pip install openpyxl
3.2 Python脚本示例
import openpyxlimport jsondef excel2json(excel_path, json_path): wb = openpyxl.load_workbook(excel_path) for sheet in wb.worksheets: rows = list(sheet.rows) if len(rows) < 2: continue headers = [cell.value for cell in rows[0]] data = [] for row in rows[1:]: item = {} for i, cell in enumerate(row): item[headers[i]] = cell.value data.append(item) with open(f\"{json_path}/{sheet.title}.json\", \"w\", encoding=\"utf-8\") as f: json.dump(data, f, ensure_ascii=False, indent=2) print(f\"导出 {sheet.title}.json 完成\")excel2json(\"PlayerConfig.xlsx\", \"./json\")
- 支持多Sheet批量导出。
- 可扩展支持类型行、注释行、空行跳过等。
4. 进阶用法
4.1 支持类型标注
- 解析第二行为类型,自动转换数据类型。
4.2 支持注释行
- 以
#
或//
开头的行自动跳过。
4.3 支持多表关联
- 例如武器表有
bullet_id
字段,自动校验其在子弹表中存在。
4.4 支持导出为对象(以id为key)
{ \"1\": {\"id\":1, \"name\":\"Soldier\", ...}, \"2\": {\"id\":2, \"name\":\"Scout\", ...}}
5. Unity/游戏项目中的应用
- 策划用Excel维护数据,程序用Excel2Json导出JSON,Unity用
JsonUtility
或Newtonsoft.Json
加载。 - 支持自动化导出、版本管理、热更等。
6. 典型工作流
- 策划在Excel中编辑配置表。
- 一键运行Excel2Json工具,批量导出所有Sheet为JSON。
- 程序/客户端/服务器加载JSON,驱动游戏逻辑。
- 配置表变更时,重新导出即可。
7. 参考链接
- Excel2Json(zwcloud版)
- Configer
- TableExportTool
下面详细讲解Excel2Json工具的具体实现逻辑,包括常见的功能点、处理流程、关键技术细节,并给出伪代码和部分实现示例,便于你理解和扩展。
一、核心功能需求
- 读取Excel文件(.xls/.xlsx),支持多Sheet。
- 解析表头(字段名)、可选类型行、数据行。
- 支持注释行、空行跳过。
- 类型自动转换(如int、float、string、bool、array等)。
- 导出为JSON文件,支持数组或对象结构。
- 可扩展:多表导出、外键校验、代码生成、二进制导出等。
二、实现流程
1. 读取Excel文件
- 使用如
openpyxl
(.xlsx)、xlrd
(.xls)等库读取Excel。 - 遍历每个Sheet。
2. 解析表结构
- 第一行:字段名(如id, name, hp)。
- 第二行(可选):类型(如int, string, float)。
- 第三行及以后:数据行。
3. 处理注释和空行
- 行首为
#
、//
等视为注释,跳过。 - 全部为空的行跳过。
4. 类型转换
- 根据类型行,将字符串转为对应类型。
- 支持基础类型(int、float、string、bool)、数组(如用分隔符分割)、枚举等。
5. 组装数据结构
- 每行数据转为dict,所有行组成list。
- 可选:以id为key转为dict。
6. 导出为JSON
- 用
json.dump
等方法写入文件,支持格式化。
三、伪代码流程
for each sheet in excel_file: rows = get_all_rows(sheet) if rows < 2: continue field_names = rows[0] if is_type_row(rows[1]): field_types = rows[1] data_start = 2 else: field_types = [\'string\'] * len(field_names) data_start = 1 data_list = [] for row in rows[data_start:]: if is_comment_or_empty(row): continue item = {} for i, value in enumerate(row): item[field_names[i]] = convert_type(value, field_types[i]) data_list.append(item) write_json(sheet_name + \".json\", data_list)
四、关键技术细节
1. 类型转换实现
def convert_type(value, type_str): if type_str == \'int\': return int(value) if value != \'\' else 0 elif type_str == \'float\': return float(value) if value != \'\' else 0.0 elif type_str == \'bool\': return value.lower() in (\'1\', \'true\', \'yes\') elif type_str == \'array_int\': return [int(x) for x in value.split(\'|\') if x] else: return str(value)
2. 注释/空行判断
def is_comment_or_empty(row): if not row or all(cell is None or str(cell).strip() == \'\' for cell in row): return True first_cell = str(row[0]).strip() return first_cell.startswith(\'#\') or first_cell.startswith(\'//\')
3. 导出为对象结构
# 以id为key导出data_dict = {str(item[\'id\']): item for item in data_list}json.dump(data_dict, f, ensure_ascii=False, indent=2)
五、Python实现示例
import openpyxlimport jsonimport osdef excel2json(excel_path, out_dir): wb = openpyxl.load_workbook(excel_path) for sheet in wb.worksheets: rows = list(sheet.rows) if len(rows) < 2: continue field_names = [cell.value for cell in rows[0]] # 判断第二行是否为类型行 type_row = [cell.value for cell in rows[1]] is_type_row = all(t in (\'int\', \'float\', \'string\', \'bool\') for t in type_row) if is_type_row: field_types = type_row data_start = 2 else: field_types = [\'string\'] * len(field_names) data_start = 1 data = [] for row in rows[data_start:]: values = [cell.value for cell in row] if is_comment_or_empty(values): continue item = {} for i, value in enumerate(values): item[field_names[i]] = convert_type(value, field_types[i]) data.append(item) os.makedirs(out_dir, exist_ok=True) with open(f\"{out_dir}/{sheet.title}.json\", \"w\", encoding=\"utf-8\") as f: json.dump(data, f, ensure_ascii=False, indent=2) print(f\"导出 {sheet.title}.json 完成\")# 参考上文的convert_type和is_comment_or_empty函数excel2json(\"PlayerConfig.xlsx\", \"./json\")
六、进阶功能扩展
- 多Sheet批量导出。
- 外键校验:如weapon表的bullet_id在bullet表中必须存在。
- 代码自动生成:根据表结构生成C#/C++/Lua等数据结构代码。
- 二进制导出:用struct/protobuf/flatbuffers等序列化。
- 热更支持:导出带版本号/MD5,支持运行时热加载。
七、常见表头约定
- 字段名行、类型行、可选注释行,数据行。
八、总结
Excel2Json工具的实现逻辑就是:
读取Excel → 解析表头/类型/数据 → 类型转换 → 组装数据结构 → 导出JSON,
可根据实际需求扩展多表、外键、代码生成、二进制、热更等功能。