1. 程式人生 > >Excel表格轉Json資料結構

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)* ```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