首页全站导航手机版加入收藏关注我们
全站导航
  • 手游行业
  • 游戏问答
  • 新游前瞻
  • 游戏动态
  • 视频攻略
  • 新游预告
  • 热游视频
  • 周边视频
  • 资讯中心
  • 游戏攻略
  • 礼包中心
  • 热门攻略
  • 游戏专区
  • 手游合集
  • 手游分类
  • 手游开服
  • 手游开测
  • 全部手游
  • 苹果排行
  • 安卓排行
  • 单机排行
  • 网游排行
  • 福利美图
  • 吐槽八卦
  • 内涵GIF
  • 游戏截图
  • 游戏壁纸
关注我们
手游巴士

资讯

  • 资讯
  • 游戏
  • 视频
  • 礼包
  • 图片
  • 首页
  • 游戏中心
  • 手游行业
  • 新游资讯
  • 新游预告
  • 游戏活动
  • 综合资讯
  • 硬件资讯
  • 游戏攻略
  • 游戏评测
当前位置:首页 > 手游资讯 > 手游行业 > 看了这篇,EXCEL 导出 JSON 再也不用求人啦

看了这篇,EXCEL 导出 JSON 再也不用求人啦

2022-11-29 13:09 来源:网络 作者:佚名

用手机看

扫描二维码随身看资讯 使用手机 二维码应用 扫描右侧二维码,您可以
1.在手机上细细品读~
2.分享给你的微信好友或朋友圈~

实际开发过程中,策划习惯使用 Excel 填写游戏数据,而程序使用的配置数据一般是 xml,json,lua 或者某种自定义的 DSL (Domain Specific Language) 等,或是 scriptable 等二进制文件,所以产生了一个把 Excel 里的数据转换成程序所需要的 "导表" 的过程.

一般团队的导表工具都是程序写的,有好的方面,也有坏的方面.好的方面是: 程序会对比 MD5 码来确定文件一致.坏的方面是: 要规定文件路径,只能一次性转换所有表格,或者选择所需转换表格时难用的 UI, 表格 sheet 名和表的某一行必须有特殊规定等.最大的问题还是这个工具对策划并不开源,加上导表工具里还有上传 SVN, 重启服务器等一系列自动化操作,出了错误之后无法确定是配置数据问题,还是工具问题,网络问题,在这条管线里面,就有了巨大的甩锅空间.

所以策划要牢牢把握住这口锅,出了错就是你配置的错,谁让你离开了 Excel 连游戏都不会做了呢? 下面以 json 格式举例,讲几种策划也能学会的方法,制作自己的导表工具.

题外话,非常不推荐直接把 Excel 导入进数据库的操作.

方法一: 手动转换

最简单的就是复制粘贴手动存成 json, 对,就这样干,因为程序要的就是个 json 文件而已.沙塔斯城里的商人说过一句话:

"你要战争,我就给你战争,水果贩."

我们先分析下 json 格式一般是什么样的,以下面这段为例:

可以看出,整个文件是用大括号 {} 包裹起来,左边引号里的是 key, 右边是对应的 value. Value 有多种类型: 是个数字的 / 用引号圈起来的 / 用大括号圈起来的 / 和用中括号圈起来的,那么我们只要弄成这样就好了.

下面看 excel 表格里面的格式一般是这样的:

第一行是字段名,下面是字段的值,一般用 id 作为数据库里面的 key, 或者还有自动生成的 uid, 增加一行用作标记改字段的类型等,大差不差的内容.我们需要的就是把每一行都通过 "字段: 值,字段: 值..." 的形式连接起来,然后用个大括号来包裹即可.

我们后面加一列,通过 Excel 的函数,来获取我们需要的数据.给策划新人们一个建议,就是函数要一步一步地写,哪怕一共有十几步,每一步的结果都放在一列里,确认结果正确后,再拼接到一起,写一个超长的函数 (不能超过 255 个字符), 然后删掉中间的步骤,云淡风轻地对旁边的人说:"不就是这样简单吗?"

第一步:

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

index 函数用来获得字段名,第一个参数 $A$1:$F$1 是第一行需要的字段范围,注意加上 $ 符号,快捷键是 F4...(自己搜索吧,有一种教人 ' 这是冰箱 ' 的感觉), 第二个参数是当前值所在的列号,如果前面还有空行的话,这里要减去相应的数量.

横着一拖,竖着一拖,看到了需要的内容是我们要的 key.

接着连接冒号和每一行的值:

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

然后使用 textJoin 函数,连接在一起,外面接上大括号就好了.

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

有人问了,所需要的 json 的 key 有引号的啊,要怎么办?

最简单的就是字段名字就给他加上引号!

到这里主体部分就完成了,每一条 {} 大括号里面的,都是个 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)=3IsDead(Bob)

这个时候为了策划填表方便,可能每一列都有特殊的拼接方法,我们在第二行里面写上值的类型,示例如下:

这种会有很多特殊的,定制的内容,例如看到 lambda 的时候,赋值给一个临时变量名,例如

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

array 字段为了策划填写方便,用逗号分割起来,生成的时候还是要分别加上引号,并用中括号括起来

"keyword":["小猪","小肚","小鸡"]

面对这些定制化的需求,直接用 Excel 里的函数,就捉襟见肘了.那么我们来自己写一个,高度定制化的函数。

打开 Visual Basic 的 IDE,如果你的 Excel 不显示开发工具选项卡,则需要在自定义功能区里勾选一下。

插入一个模块,写入下列代码:

Function textToJson(ByVal s As Variant)

Dim myKey,myValue
Dim valueType
Dim output
'将单元格范围作为选中范围
Dim mr As Range
Set 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 If
Next i

'最后拼接一下
If IsError(output) Or Len(output) <= 1 Then
    textToJson = ""
Else
    output = Left(output, Len(output) - 1)   
    textToJson = "{" & output & "}"  
End If
End Function

这样我们定义了 textToJson()这个函数,在最后一列里面输入 = textToJson (A3:F3) 即可转换。

如果其他表格也想使用该函数,但是不想转换成 xlsm 这带宏的格式,怎么办?

我们可以把这个文件另存为 xlam,作为加载宏,给其他表格使用。

其他表格使用时,通过开发工具》Excel 加载项》浏览 找到该文件,即可使用 textToJson 这个自定义函数。

方法三:VBA

上面既然已经用了自定义函数,还要另存为等手动操作,那么不如使用 VBA 直接导出。写法基本一样,只不过创建了一个 json 文件作为 object 来承载导出的内容。注意,如果报出找不到对象的错误的话,那么可以去人民公园试试。

Sub toJson()

Dim i, j, k As Integer
Dim myString, output As String
Dim myRange As Range
Dim myArr()
Dim myTitle()
Dim WriteStream As Object


Set MyFile = CreateObject("Scripting.FileSystemObject").OpenTextFile("D:\testjson.json", 8, True)

myString = ""
output = ""

i = 0
j = 0
k = 0

Set myRange = Selection
myArr = myRange

ReDim myTitle(20)

For k = 0 To myRange.Columns.Count - 1

    myTitle(k) = myArr(1, k + 1)
    
Next k


For 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

以上代码是我们做过的一个答题游戏的例子,超过几万条有趣的问题。配置表可以稍微露一下:

方法四:其他

大家可能会问了,这一个一个表格的导出,太麻烦了,能不能一起导出多张?很多公司用 VBA 写过导出多张表格的工具,我也写过,但因为 VBA 先天的弱势,速度极慢,还容易卡死。

这里推荐用 python 去写,速度快 100 倍。可以用 openpyxl 库,至于如何写,可以参考上一篇文章:世界杯到了,写个爬虫获取球员数据吧

因为很简单,在此不再赘述了,可以作为初学 python 的某种练习。还可以通过 pandas 模块把 excel 读成字典对象,然后直接存进 mySQL 或者 mongodb,根本不需要导表这个中间过程了。

本文来自微信公众号:千猴马的游戏设计之道 (ID:baima21th),作者:千两

以上就是手游巴士为您提供《看了这篇,EXCEL 导出 JSON 再也不用求人啦》的详细内容,更多精彩内容请继续阅读上一篇《雷军预热小米 13:续航超越苹果 iPhone 14 Pro Max 且保证宽度、厚度和握感》

表羞涩嘛~喜欢就点我

分享吧~提高逼格:

相关阅读

  • 2022-11-29 手表也能处理邮件和日历,谷歌正开发 WearOS 版 Gmail 和 Google Calendar

  • 2022-11-29 Word 中的“三线表”是如何制作的?

  • 2022-11-29 百度 Apollo:2023 年将打造全球最大全无人自动驾驶运营服务区

  • 2022-11-29 售价 1 万美元限量 99 套,Pininfarina 推出以法拉利 Modulo 为灵感的 iPhone 保护套

  • 2022-11-29 英国“劳斯莱斯”成功测试世界上首个氢气式飞机发动机

  • 2022-11-29 iQOO Neo 7 SE 现身电信终端产品库:天玑 8200 + 5000mAh 电池

  • 2022-11-29 无缘安卓 13 新特性,三星平板升级后通知栏仍为单列布局

  • 2022-11-29 使命召唤的新模式,做成了“逛街版塔科夫”

  • 2022-11-29 苹果 App Store Awards 2022 公布:《英雄联盟电竞经理》获中国年度游戏

  • 2022-11-29 ARM GPU 漏洞暴露安卓升级困局,谷歌 Project Zero 团队谴责厂商偷懒行为

  • 2022-11-29 IC Insights:预计 2023 年半导体销售将同比减少 5%

  • 2022-11-29 雷军预热小米 13:续航超越苹果 iPhone 14 Pro Max 且保证宽度、厚度和握感

  • 2022-11-29 看了这篇,EXCEL 导出 JSON 再也不用求人啦

  • 2022-11-29 21 岁的数学大师 —— 埃尔米特,第一个证明 e 是超越数的人

  • 2022-11-29 一汽丰田第 1000 万辆汽车下线,为电动 SUV 车型 bZ4X

  • 2022-11-29 超频 i9-13900K/ i7-13700K 更轻松,技嘉 Instant 6GHz 技术下放至 Z690 平台

  • 2022-11-29 酷比魔方 iPlay50 Pro 首发价 799 元:采用 2K 全贴合屏,支持 4G 全网通

  • 2022-11-29 偷录他人微信聊天记录能作为证据吗?北京互联网法院给出解答

  • 2022-11-29 将合并至 Linux 6.2,壹号本 OnexPlayer 传感器 / 风扇驱动扩大支持设备列表

  • 2022-11-29 新能源汽车“国补”即将退场:比亚迪率先涨价,补贴影响逐步减弱

  • 2022-11-29 马斯克称保护儿童安全为推特当务之急,负责团队却仅剩 1 人

  • 2022-11-28 小米 13 / Pro 采用全新科技纳米皮:皮质手感,抗黄边、抗磨损、抗脏污

  • 2022-11-28 英特尔酷睿 i7-1370P 处理器现身 Geekbench:14 核 20 线程,跑分接近 AMD R7 5800X

  • 2022-11-28 投资 1.88 亿美元,富士胶片宣布建立细胞培养基生产工厂

  • 2022-11-28 法拉利 Vision GT 概念车亮相:搭载混动双涡轮增压 V6 发动机,仅可在《GT 赛车 7》游戏中体验

热点推荐

  • 大话2《宫里的大话》第二话 揭秘国风赋新计划背后的故事大话2《宫里的大话》第二话 揭秘国风赋新计划背后的故事
  • 爱游戏2017Chinajoy大玩情怀  “游戏不灭 天生爱玩”!爱游戏2017Chinajoy大玩情怀 “游戏不灭 天生爱玩”!
  • 映客入局王者荣耀职业联赛,投资过亿开启“一键即播”映客入局王者荣耀职业联赛,投资过亿开启“一键即播”
  • 太极熊猫3:猎龙与好莱坞大片金刚:骷髅岛建立影游合作太极熊猫3:猎龙与好莱坞大片金刚:骷髅岛建立影游合作

热门游戏

  • 时逆

    时逆

    立即下载
  • 剑侠世界

    剑侠世界

    立即下载
  • 铁甲风暴

    铁甲风暴

    立即下载
  • 三国志奇侠传

    三国志奇侠传

    立即下载
  • 蜀山战神

    蜀山战神

    立即下载
  • 人气动漫大乱斗

    人气动漫大乱斗

    立即下载

热点资讯

更多+
  • 啪啪三国2手游枪兵好玩吗?枪兵作战有什么特色
    啪啪三国2手游枪兵好玩吗?枪兵作战有什么特色
  • 轩辕剑之汉之云手游双属性职业阴阳战斗玩法
    轩辕剑之汉之云手游双属性职业阴阳战斗玩法
  • 莽荒纪3D手游新手必备 浩瀚世界里的修仙小伙伴上
    莽荒纪3D手游新手必备 浩瀚世界里的修仙小伙伴上

小编热推

更多+
《王牌竞速》手游福利时装 零下30度该穿什么?

满分攻略

  • 保卫萝卜4阿波道长60关攻略 保卫萝卜4阿波道长第六十关怎么过

    满分 保卫萝卜4阿波道长60关攻略 保卫萝卜4阿波道长第六十关怎么过

    60关
    查看全部
  • 保卫萝卜4阿波道长59关攻略 保卫萝卜4阿波道长第五十九关怎么过

    满分 保卫萝卜4阿波道长59关攻略 保卫萝卜4阿波道长第五十九关怎么过

    59关
    查看全部
  • 原神离调乐段第三天攻略 原神无相交响诗第三阶段束浪之池通关流程

    满分 原神离调乐段第三天攻略 原神无相交响诗第三阶段束浪之池通关流程

    59关
    查看全部

热门礼包

更多+

三国杀

三国杀 剩余:500/500 有效日期:2017-05-02

领取

三国杀

领取

三国杀愚人节礼包

三国杀愚人节礼包 剩余:500/500 有效日期:2017-05-31

领取

三国杀愚人节礼包

领取

三国杀独家礼包

三国杀独家礼包 剩余:500/500 有效日期:2017-07-26

领取

三国杀独家礼包

领取

三国杀移动版国庆礼包

三国杀移动版国庆礼包 剩余:500/500 有效日期:2017-11-29

领取

三国杀移动版国庆礼包

领取

一步高升新手礼包

一步高升新手礼包 剩余:491/1000 有效日期:2019-09-14

领取

一步高升新手礼包

领取

奶块首发大礼包

奶块首发大礼包 剩余:344/1900 有效日期:1970-01-01

领取

奶块首发大礼包

领取

奶块成长礼包

奶块成长礼包 剩余:297/1167 有效日期:2017-12-31

领取

奶块成长礼包

领取

植物大战僵尸2特权礼包

植物大战僵尸2特权礼包 剩余:232/300 有效日期:2018-05-31

领取

植物大战僵尸2特权礼包

领取

银河战舰代言人公测礼包

银河战舰代言人公测礼包 剩余:232/300 有效日期:2018-10-01

领取

银河战舰代言人公测礼包

领取

植物大战僵尸2豪华福包

植物大战僵尸2豪华福包 剩余:224/500 有效日期:2018-07-31

领取

植物大战僵尸2豪华福包

领取

热门合集

更多+
  • 适合女生玩的HTML5游戏

    查看合集
  • 2017手机游戏排行榜

    查看合集

手游资讯

NEWS
手游行业 手游活动 新游前瞻 综合资讯

最全攻略

RAIDERS
游戏资料 游戏攻略 硬件资讯 游戏问答

视频中心

VIDEO
视频攻略 新游预告 热门游戏 周边视频

游戏中心

GAME
手游合集 游戏分类 发号中心 热门专区

手游排行

TOP 100
安卓榜 苹果榜 单机榜 网游榜

手游巴士

手游巴士

  • 关于我们
  • 商务洽谈
  • 联系我们
  • 友情链接
  • 版权声明

Copyright © 2020-2022 手游巴士 shouyoubus.com, All Rights Reserved.赣ICP备2021011040号