您現在的位置是:首頁 > 網路遊戲首頁網路遊戲

看了這篇,EXCEL匯出JSON再也不用求人啦

  • 由 千猴馬的遊戲設計彙總 發表于 網路遊戲
  • 2022-12-29
簡介方法二:自定義函式載入項上面的例子中,有的欄位的值是陣列,用[]中括號引起來,例如“keywords”:[“小豬”,“小肚”,“小雞”]或者自定義的類似lambda表示式的東西scripts:(Count(Unit))>=100&am

怎麼建立宏

實際開發過程中,策劃習慣使用Excel填寫遊戲資料, 而程式使用的配置資料一般是xml,json,lua或者某種自定義的DSL(Domain Specific Language)等,或是scriptable等二進位制檔案,所以產生了一個把Excel裡的資料轉換成程式所需要的“導表”的過程。

一般團隊的導表工具都是程式寫的,有好的方面,也有壞的方面。 好的方面是:程式會對比MD5碼來確定檔案一致。壞的方面是:要規定檔案路徑,只能一次性轉換所有表格,或者選擇所需轉換表格時難用的UI,表格sheet名和表的某一行必須有特殊規定等。 最大的問題還是這個工具對策劃並不開源,加上導表工具裡還有上傳SVN,重啟伺服器等一系列自動化操作,出了錯誤之後無法確定是配置資料問題,還是工具問題,網路問題,在這條管線裡面,就有了巨大的甩鍋空間。

所以策劃要牢牢把握住這口鍋,出了錯就是你配置的錯,誰讓你離開了Excel連遊戲都不會做了呢?下面以json格式舉例,講幾種策劃也能學會的方法,製作自己的導表工具。

看了這篇,EXCEL匯出JSON再也不用求人啦

題外話,非常不推薦直接把Excel匯入進資料庫的操作。

方法一:手動轉換

最簡單的就是複製貼上手動存成json,對,就這樣幹,因為程式要的就是個json檔案而已。沙塔斯城裡的商人說過一句話:

“你要戰爭,我就給你戰爭,水果販。”

我們先分析下json格式一般是什麼樣的,以下面這段為例:

看了這篇,EXCEL匯出JSON再也不用求人啦

可以看出,整個檔案是用大括號{}包裹起來,左邊引號裡的是key,右邊是對應的value。 Value有多種型別:是個數字的/用引號圈起來的/用大括號圈起來的/和用中括號圈起來的,那麼我們只要弄成這樣就好了。

下面看excel表格裡面的格式一般是這樣的:

看了這篇,EXCEL匯出JSON再也不用求人啦

第一行是欄位名,下面是欄位的值,一般用id作為資料庫裡面的key,或者還有自動生成的uid,增加一行用作標記改欄位的型別等,大差不差的內容。 我們需要的就是把每一行都透過 “欄位:值,欄位:值。。。”的形式連線起來,然後用個大括號來包裹即可。

我們後面加一列,透過Excel的函式,來獲取我們需要的資料。 給策劃新人們一個建議,就是函式要一步一步地寫,哪怕一共有十幾步,每一步的結果都放在一列裡,確認結果正確後,再拼接到一起, 寫一個超長的函式(不能超過255個字元),然後刪掉中間的步驟,雲淡風輕地對旁邊的人說:“不就是這樣簡單嗎?”

第一步:

=INDEX($A$1:$F$1,COLUMN(A2))

index函式用來獲得欄位名,第一個引數$A$1:$F$1是第一行需要的欄位範圍,注意加上$符號,快捷鍵是F4。。。(自己搜尋吧,有一種教人‘這是冰箱’的感覺), 第二個引數是當前值所在的列號,如果前面還有空行的話,這裡要減去相應的數量。

index函式用來獲得欄位名,第一個引數$A$1:$F$1是第一行需要的欄位範圍,注意加上$符號,快捷鍵是F4。。。(自己搜尋吧,有一種教人‘這是冰箱’的感覺), 第二個引數是當前值所在的列號,如果前面還有空行的話,這裡要減去相應的數量。

橫著一拖,豎著一拖,看到了需要的內容是我們要的key。

看了這篇,EXCEL匯出JSON再也不用求人啦

接著連線冒號和每一行的值:

=INDEX($A$1:$F$1,COLUMN(A2))&“:”&A2

看了這篇,EXCEL匯出JSON再也不用求人啦

然後使用textJoin函式,連線在一起,外面接上大括號就好了。

=“{”&TEXTJOIN(“,”,TRUE,G2:L2)&“}”

看了這篇,EXCEL匯出JSON再也不用求人啦

有人問了,所需要的json的key有引號的啊,要怎麼辦?

最簡單的就是欄位名字就給他加上引號!

看了這篇,EXCEL匯出JSON再也不用求人啦

到這裡主體部分就完成了,每一條{}大括號裡面的,都是個json的物件。物件之間用[]包裹起來,就是一個json的列表,或者還有{}包裹組成kv對,那麼就只需要在把拼接的內容再次按照要求拼接就好了。

有人可能會問了,最重要的雲淡風輕,怎麼還沒講?這麼多輔助列,明明是手忙腳亂啊? 怎麼能寫到一個函數里面啊?

別急,這裡我們要用到陣列公式。直接上公式:

{=“{”&TEXTJOIN(“,”,TRUE,INDEX($A$1:$F$1,COLUMN(A2:F2))&“:”&A2:F2)&“}”}

只要把值從一個格子A2,變成一個範圍A2:F2,然後按CTRL+SHITF+ENTER輸入陣列公式就好了。(陣列公式最外面的大括號不是打字打上去的。。。)

至此,終於可以雲淡風輕了,因為一般程式猿也不太會用Excel,這樣就顯得你很專業了。

方法二:自定義函式載入項

上面的例子中,有的欄位的值是陣列,用[]中括號引起來,例如

“keywords”:[“小豬”,“小肚”,“小雞”]

或者自定義的類似lambda表示式的東西

scripts:(Count(Unit))>=100&Count(Wonder)>=3)||IsDead(Bob)

這個時候為了策劃填表方便,可能每一列都有特殊的拼接方法,我們在第二行裡面寫上值的型別,示例如下:

看了這篇,EXCEL匯出JSON再也不用求人啦

這種會有很多特殊的,定製的內容,例如看到lambda的時候,賦值給一個臨時變數名,例如

lambda1=(Count(Unit))>=100&Count(Wonder)>=3)||IsDead(Bob)

array欄位為了策劃填寫方便,用逗號分割起來,生成的時候還是要分別加上引號,並用中括號括起來

“keyword”:[“小豬”,“小肚”,“小雞”]

面對這些定製化的需求,直接用Excel裡的函式,就捉襟見肘了。 那麼我們來自己寫一個,高度定製化的函式。

看了這篇,EXCEL匯出JSON再也不用求人啦

開啟Visual Basic的IDE,如果你的Excel不顯示開發工具選項卡,則需要在自定義功能區裡勾選一下。

看了這篇,EXCEL匯出JSON再也不用求人啦

插入一個模組,寫入下列程式碼:

Function textToJson(ByVal s As Variant)Dim myKey, myValueDim valueTypeDim output‘將單元格範圍作為選中範圍Dim mr As RangeSet mr = s’讀取第一行的key,和當前的value組成一對For Each i In mr If Not IsEmpty(i) And i <> 0 Then ‘透過第二行的型別來處理對應的值 valueType = Cells(2, i。Column) myKey = Cells(1, i。Column) myValue = i。value Select Case valueType ’lambda把key特殊處理,加一個用行號作為序列號的變數 Case “lambda” myKey = “lambda” & i。Row - 2 output = output & myKey & “=” & myValue & “,” ‘array把值特殊處理,將逗號分隔的字串放在一個數組裡 Case “array” temp = “” tempString = Split(i。value, “,”) For Each k In tempString temp = temp & Chr(34) & k & Chr(34) & “,” Next k temp = Left(temp, Len(temp) - 1) temp = “[” & temp & “]” myValue = temp output = output & myKey & “:” & myValue & “,” ’其他情況不做處理 Case Else output = output & myKey & “:” & myValue & “,” End Select End IfNext i‘最後拼接一下If IsError(output) Or Len(output) <= 1 Then textToJson = “”Else output = Left(output, Len(output) - 1) textToJson = “{” & output & “}” End IfEnd Function

這樣我們定義了textToJson()這個函式,在最後一列裡面輸入=textToJson(A3:F3)即可轉換。

看了這篇,EXCEL匯出JSON再也不用求人啦

如果其他表格也想使用該函式,但是不想轉換成xlsm這帶宏的格式,怎麼辦?

我們可以把這個檔案另存為xlam,作為載入宏,給其他表格使用。

看了這篇,EXCEL匯出JSON再也不用求人啦

其他表格使用時,透過開發工具》Excel載入項》瀏覽 找到該檔案,即可使用textToJson這個自定義函式。

看了這篇,EXCEL匯出JSON再也不用求人啦

方法三:VBA

上面既然已經用了自定義函式,還要另存為等手動操作,那麼不如使用VBA直接匯出。寫法基本一樣,只不過建立了一個json檔案作為object來承載匯出的內容。注意,如果報出找不到物件的錯誤的話,那麼可以去人民公園試試。

Sub toJson()Dim i, j, k As IntegerDim myString, output As StringDim myRange As RangeDim myArr()Dim myTitle()Dim WriteStream As ObjectSet MyFile = CreateObject(“Scripting。FileSystemObject”)。OpenTextFile(“D:\testjson。json”, 8, True)myString = “”output = “”i = 0j = 0k = 0Set myRange = SelectionmyArr = myRangeReDim myTitle(20)For k = 0 To myRange。Columns。Count - 1 myTitle(k) = myArr(1, k + 1)Next kFor i = 2 To myRange。Rows。Count output = output & “{” For j = 1 To myRange。Columns。Count If myTitle(j - 1) = “truth” Then myString = Trim(myArr(i, j)) output = output & Chr(34) & myTitle(j - 1) & Chr(34) & “:” & LCase(myString) & “,” ElseIf myTitle(j - 1) = “tag” Or myTitle(j - 1) = “falseWord”Then myString = Trim(myArr(i, j)) output = output & Chr(34) & myTitle(j - 1) & Chr(34) & “:[” & mySubString(myString) & “],” ElseIf myTitle(j - 1) = “difficulty” Then myString = Trim(myArr(i, j)) output = output & Chr(34) & myTitle(j - 1) & Chr(34) & “:” & myString & “,” Else myString = Trim(myArr(i, j)) output = output & Chr(34) & myTitle(j - 1) & Chr(34) & “:” & Chr(34) & myString & Chr(34) & “,” End If Next j output = Mid(output, 1, Len(output) - 1) output = output & “},” & Chr(10) Next i output = Mid(output, 1, Len(output) - 2) ’ Set WriteStream = CreateObject(“ADODB。Stream”)‘’ With WriteString‘ 。Type = 2’ 。Charset = “UTF-8”‘’ End With MyFile。WriteLine (output) MyFile。Close Set MyFile = Nothing MsgBox “成功!!” ‘UserForm1。TextBox1。Text = output ’UserForm1。Show End Sub

以上程式碼是我們做過的一個答題遊戲的例子,超過幾萬條有趣的問題。配置表可以稍微露一下:

看了這篇,EXCEL匯出JSON再也不用求人啦

方法四:其他

大家可能會問了,這一個一個表格的匯出,太麻煩了,能不能一起匯出多張?很多公司用VBA寫過匯出多張表格的工具,我也寫過,但因為VBA先天的弱勢,速度極慢,還容易卡死。

這裡推薦用python去寫,速度快100倍。可以用openpyxl庫,至於如何寫,可以參考上一篇文章:

世界盃到了,寫個爬蟲獲取球員資料吧

看了這篇,EXCEL匯出JSON再也不用求人啦

Top