Excel表格轉Json數據結構
Excel表格轉Json數據結構
輾轉了好幾個項目,每個項目的導表工具都巨難用,速度慢,潛規則多,擴展性差,不易于調試。Sqlite,Json,Lua,Xml各種格式都用過。
舉個例子:
大多數導表工具不支持文本數組的解析,因為它們對數組的解析算法異常粗暴,無非就是一個Split(value, ","),當你的文本數組沒有逗號時,一切都OK,一旦出現逗號,解析結果錯誤,但程序依舊正常運行,直到游戲中讀取錯誤時,你才能意識到出問題了。
不能類型組合,通常這些導表工具都不支持類型之間的組合,例如整數數組,哈希數組等等。有的支持整數數組,但它并不是把整數和數組兩個類型結合,而是單獨定義了一個整數數組的類型,當需要稍微復雜一點的結構時,則不支持甚至完全不能實現,比如數組嵌套數組。
錯誤無法定位,輸出的錯誤信息幾乎沒有看不懂,策劃更是束手無策。
沒有類型安全,當配置表的某個字段名被修改時,程序可能完全不知道,直到游戲中讀取配置錯誤。
數據結構
在數據結構上我個人最理想的數據格式是Json。
Sqlite 對客戶端不友善,大多數客戶端對SQL語句并不熟悉。作為配置數據而言,關系數據庫的優勢并不明顯,如果數據查詢需要復雜的SQL語句,這個數據結構設計本身就是錯誤的,如果僅使用簡單的SQL語句查詢,那為什么不直接用Key-Value數據結構?此外,Sqlite需要用專門的數據庫軟件瀏覽,而不能直接在IDE或者文本編輯器中查看。
Lua 結構跟Json類似,但它有兩個問題,1. 不容易區分數組和哈希,2. 作為數據結構而言,應用范圍比較狹窄,Json比Lua出名太多,Json第三方解析庫比Lua多太多,以至于大家更容易接受Json而非Lua。
Xml 太多額外數據,閱讀相對于Json不直觀。
Json 結構簡潔,大多數文本編輯器可高亮內容,第三方解析庫眾多,流行范圍廣,前后端都容易接受。
易用性
我見過一次導表開銷花掉1小時的,以至于沒有人敢輕易嘗試導出Excel,這個情況持續了1年,終結這個情況的并不是項目涼了,而是我重新實現了一個工具且完全它的解析格式,新的解析程序導出全部Excel只需10秒。
我見過Excel配置非常繁瑣,眾多潛規則,當你新建一份配置表時,你必須參考一份舊表,要不然你根本不知道該怎么填。
一個好用的導表工具
由于最近重返手游行業,于是想實現一個效率,擴展性,易用性,安全性都比較OK的導表工具。
格式 (詳情請看Demo)
// 已支持的格式
bool 布爾值
number 數值
string 字符串
list 數組
dict 哈希
type 自定義結構
// 格式定義
bool b;
number n;
string s;
[number] n_list; // 數值數組 list<number> n_list;
{number} n_dict; // 數組哈希 dict<number> d_dict;
<number n, string s> type; // 自定義結構 struct {
// number n;
// string s;
// } type;
// 類型組合
[[number]] n_n_list; // 數組嵌套數組
{[number]} n_n_dict; // 哈希嵌套數組
<[number] n_list, {number} n_dict> type; // 數據格式如下:
// struct {
// list<number> n_list;
// dict<number> n_dict;
// } type;
錯誤定位 (詳情請看Demo)
// 打印錯誤文件,行,列,出錯原因
C:\Github\xlsx2json>export.py
> 異常: C:\Github\xlsx2json/in/cfg_2.xlsx | 5:2 | [bool]值錯誤 "
> ---Export End---
安全性 (詳情請看Demo)
// 輸出指定語言的數據結構(當前只支持C++和C#)
// 可通過Json庫解析到對應的數據結構
var test = Json.From<config.Test>("test.json");
var n = test.n;
var s = test.s;
結束
執行文件:export.py
運行環境:Python3.0
運行依賴:openpyxl
導表配置 (export.py文件):
# Json輸入目錄
JSON_I = os.getcwd() + "/in/"
# Json輸出目錄
JSON_O = os.getcwd() + "/out/"
# 結構化輸出目錄
STRUCT_O = os.getcwd() + "/out/config.cs"
# 命名空間
NAMESPACE = "config"

浙公網安備 33010602011771號