Excel表格轉Json資料結構
阿新 • • 發佈:2020-03-21
# 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)*
```C++
// 已支援的格式
bool 布林值
number 數值
string 字串
list 陣列
dict 雜湊
type 自定義結構
// 格式定義
bool b;
number n;
string s;
[number] n_list; // 數值陣列 list n_list;
{number} n_dict; // 陣列雜湊 dict d_dict;
type; // 自定義結構 struct {
// number n;
// string s;
// } type;
// 型別組合
[[number]] n_n_list; // 陣列巢狀陣列
{[number]} n_n_dict; // 雜湊巢狀陣列
<[number] n_list, {number} n_dict> type; // 資料格式如下:
// struct {
// list n_list;
// dict n_dict;
// } type;
```
**錯誤定位** *(詳情請看Demo)*
```C++
// 列印錯誤檔案,行,列,出錯原因
C:\Github\xlsx2json>export.py
> 異常: C:\Github\xlsx2json/in/cfg_2.xlsx | 5:2 | [bool]值錯誤 "
> ---Export End---
```
**安全性** *(詳情請看Demo)*
```C#
// 輸出指定語言的資料結構(當前只支援C++和C#)
// 可通過Json庫解析到對應的資料結構
var test = Json.From("test.json");
var n = test.n;
var s = test.s;
```
### 結束
執行檔案:export.py
執行環境:Python3.0
執行依賴:openpyxl
導表配置 (export.py檔案):
```python
# Json輸入目錄
JSON_I = os.getcwd() + "/in/"
# Json輸出目錄
JSON_O = os.getcwd() + "/out/"
# 結構化輸出目錄
STRUCT_O = os.getcwd() + "/out/config.cs"
# 名稱空間
NAMESPACE = "config"
```
[Github傳送門](https://github.com/mmc1993/xl