> 技术文档 > Excel转JSON:高效游戏开发数据转换指南

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表结构如下:

id name hp speed 1 Soldier 100 5.5 2 Scout 80 6.2

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 支持类型标注

id name hp speed int string int float 1 Soldier 100 5.5 2 Scout 80 6.2
  • 解析第二行为类型,自动转换数据类型。

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用JsonUtilityNewtonsoft.Json加载。
  • 支持自动化导出、版本管理、热更等。

6. 典型工作流

  1. 策划在Excel中编辑配置表。
  2. 一键运行Excel2Json工具,批量导出所有Sheet为JSON。
  3. 程序/客户端/服务器加载JSON,驱动游戏逻辑。
  4. 配置表变更时,重新导出即可。

7. 参考链接

  • Excel2Json(zwcloud版)
  • Configer
  • TableExportTool

下面详细讲解Excel2Json工具的具体实现逻辑,包括常见的功能点、处理流程、关键技术细节,并给出伪代码和部分实现示例,便于你理解和扩展。


一、核心功能需求

  1. 读取Excel文件(.xls/.xlsx),支持多Sheet。
  2. 解析表头(字段名)、可选类型行、数据行。
  3. 支持注释行、空行跳过
  4. 类型自动转换(如int、float、string、bool、array等)。
  5. 导出为JSON文件,支持数组或对象结构。
  6. 可扩展:多表导出、外键校验、代码生成、二进制导出等。

二、实现流程

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,支持运行时热加载。

七、常见表头约定

字段名 类型 备注 数据1 数据2 … id int … 1 2 …
  • 字段名行、类型行、可选注释行,数据行。

八、总结

Excel2Json工具的实现逻辑就是:
读取Excel → 解析表头/类型/数据 → 类型转换 → 组装数据结构 → 导出JSON
可根据实际需求扩展多表、外键、代码生成、二进制、热更等功能。