资产经济网
adtop
adqu_z
adqu_y
adqu2

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

发布时间:2022-11-29 13:19  文章来源:IT之家  发布者:沐瑶   阅读量:17808   

在实际开发过程中,规划习惯是用Excel填写游戏数据,而程序使用的配置数据一般是xml,json,lua或者某种自定义DSL,或者scriptable之类的二进制文件,这样就产生了一个把Excel中的数据转换成程序所需的指南表的过程。

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

团队一般的表导工具都是程序写的,有好的方面也有不好的方面好的方面是程序将比较MD5代码,以确保文件是一致的不好的方面是要指定文件路径,所有的表只能一次性转换,或者在选择需要的转换表时很难使用的UI,表表的名称和表的某一行都要有特别的规定最大的问题是这个工具对于规划来说不是开源的此外,还有上传SVN,重启服务器等一系列自动操作在仪表指南工具中出现错误后,无法确定是配置数据问题,工具问题还是网络问题在这个管道里,有一个巨大的甩锅空间

所以策划要牢牢抓住这个锅如果出了问题,那是你的配置问题谁让你离开Excel连游戏都不会玩了以json格式为例,说说规划中可以学习的几种方法,自己做个引导工具

题外话,不建议直接将Excel导入数据库。

方法1:手动转换

最简单的就是手动复制粘贴保存为json是的,就这么做,因为程序想要的只是一个json文件

如果你想要战争,我就给你,卖水果的。"

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

正如您所看到的,整个文件都用花括号括起来,左边是引号中的键,右边是相应的值值有很多种类型:它是一个数字/用引号括起来/用花括号括起来/用括号括起来,所以我们只需要把它做成这样

看下面excel表格中的格式,大致是这样的:

第一行是字段名,下面是字段的值一般在数据库中用id作为键,或者有一个自动生成的uid添加了一个新行来标记字段的类型,这是非常不同的我们需要的是以字段:值,字段:值的形式连接每一行... ",然后用花括号括起来

我们在后面加一栏,通过Excel函数获取我们需要的数据给规划人员的一个建议是,应该一步一步地编写功能,即使总共有十几个步骤每一步的结果都放在一列中在确认正确的结果后,我们将它们拼接在一起,编写一个超长的函数然后,我们会把中间的步骤删掉,用淡淡的声音对旁边的人说:没那么简单吧

第一步:

=索引)

index函数用于获取字段名第一个参数$A:$F是第一行中的必需字段范围注意,添加了$符号,快捷键是F4...第二个参数是当前值所在的列号如果前面有空行,这里要减去相应的数字

水平拖动,垂直拖动,看看我们需要的是我们想要的关键。

然后将冒号与每行的值连接起来:

= INDEX)amp, ": " amp,主动脉第二声

然后使用textJoin函数,将它们连接在一起,在外面加上花括号。

= " " ampTEXTJOINamp""

有人问,要求的json键有引号我该怎么办

最简单的就是引用字段名!

这里,主体就完成了每个花括号都是一个json对象对象被包装在一起,也就是一个json列表,或者有包形成kv对然后,只需要将拼接的内容按要求重新拼接即可

可能有人会问,怎么还没说到最重要的辅助栏这么多,是不是手忙脚乱怎么把它写成函数呢

别担心,这里我们要用数组公式。直接进入公式:

= " " amptext join)amp, ": " amp,a2:F2)amp,""

只需将数值从一个网格A2改为一个范围A2:F2,然后按CTRL+SHITF+ENTER进入数组公式。

在这一点上,最后,它的光,因为一般程不知道如何使用Excel,这使得你很专业。

方法2:自定义功能插件。

在上面的例子中,一些字段的值是数组,这是由括号引起的,例如

"关键词 ":

或者自定义lambda表达式。

脚本:)= 100amp伯爵(惊奇)= 3岁(鲍勃)

这时候为了规划填表方便,每一栏可能会有特殊的拼接方式。我们将值的类型写在第二行,示例如下:

这将有许多特殊的,定制的内容,比如当你看到lambda时,就给它指定一个临时的变量名

lambda 1 =)gt,= 100安培,count(Wonder)gt,=3)

为了方便规划和填写数组字段,用逗号分隔,生成时要分别加引号和括号。

"关键字 ":

面对这些定制需求,很难直接使用Excel中的功能所以我们自己写一个高度定制的函数吧

打开Visual Basic的IDE如果您的Excel没有显示开发人员选项卡,您需要在自定义功能区中选中它

插入一个模块并编写以下代码:

FunctionTextToJSONDIMMYKEY,MyValueDimValueTypeDimOutput '将单元格区域作为选定的区域DimmrAsRangeSetmr = s '读取第一行中的键,并与当前值组成一对foreachinmrifnotice (I)和ILT,gt,0然后 '按第二行的类型处理相应的值valuetype = cells (2,i.column) mykey = cells (1,I . column)my value = I . valueelectcasevaluetype ' Lambda对键进行特殊处理,并添加一个变量case "lambda " mykey = 并以行号作为序列号。I . Row—2 output = output amp,myKeyamp " = " ampmyValueamp "," '数组对值进行特殊处理,并将逗号分隔的字符串放入数组case " array " temp = " " tempstring = split(I . value, ", ")foreachkintempstringtemp = tempamp,chr(34)amp,坎普,chr(34)amp, ","Nextktemp=Left(temp,Len(temp)—1)temp = "( " amp,tempamp ") " my value = temp output = output amp,myKeyamp ": " amp,myValueamp "," '情况未处理CaseElseoutput = outputampmyKeyamp ": " amp,myValueamp ","EndSelectEndIfNexti '最终拼接if iserror (output)或len(output)lt,= 1 entexttojson = " " else output = Left(output,Len(output)—1)textToJson = " " amp,outputamp""EndIfEndFunction

这定义了函数textToJson,可以通过在最后一列输入= textToJson (A3:F3)进行转换。

其他表想用这个函数,但是不想用宏转换成xlsm格式怎么办。

我们可以将该文件保存为xlam,并将其用作其他表的插件。

使用其他表单时,通过开发工具Excel Add—in浏览查找文件,可以使用自定义函数textToJson。

方法三:VBA

既然上面已经使用了自定义函数,还需要手动操作如另存为,不如用VBA直接导出编写方法基本相同,只是创建了一个json文件作为对象来携带导出的内容注意,如果报了找不到对象的错误,可以去人民公园试试

SubtoJsonDimi,j,kAsIntegerDimmyString,outputasstringdimmyrangeasrangedimmyarrdimmytitledimwritesteamasobjectsetmyfile = CreateObject( "脚本FileSystemObject ")open textfile( " D: test JSON . JSON ",8,True)myString = " " output = " " I = 0j = 0k = 0 setmy range = selection myarr = myRangeReDimmyTitle(20)Fork = 0 tomy rangecolumns . Count—1 mytitle(k)= myArr(1,k+1)NextkFori=2TomyRangeRows . Countoutput = outputamp""Forj=1TomyRangecolumns . CountIfmyTitle(j—1)= " true " ThenmyString = Trim(myArr(I,j))output = output amp,chr(34)amp,my title(j—1)amp,chr(34)amp, ": " amp,LCase(我的字符串)amp ", " elseifmyttitle(j—1)= " tag " ormy title(j—1)= " false word " ThenmyString = Trim(myArr(I,j))output = output amp,chr(34)amp,my title(j—1)amp,chr(34)amp, ":( " amp,mySubString(我的字符串)amp "), " elseifmyttitle(j—1)= "难度"ThenmyString=Trim(myArr(i,j))output = output amp,chr(34)amp,my title(j—1)amp,chr(34)amp, ": " amp,myStringamp ","ElsemyString=Trim(myArr(i,j))output = output amp,chr(34)amp,my title(j—1)amp,chr(34)amp, ": " amp,chr(34)amp,myStringampchr(34)amp, ","EndIfNextjoutput=Mid(output,1,Len(output)—1)output = output amp, ", " ampChr(10)Nextioutput=Mid(output,1,Len(output)—2) ' set write stream = CreateObject( " ADODBStream")''WithWriteString 'Type=2 'charset = " UTF—8 " ' End with my file . writeline(output)my file . close set my file = nothing msgbox "成功!!" '用户表单1textbox 1 . Text = output ' user form 1

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

方法4:其他

你可能会问,一次导出一个表太麻烦了可以一起导出多个表吗很多公司都写了用VBA导出多个表的工具,我也写过,但是由于VBA固有的弱点,速度极慢,容易卡死

这里推荐用python写,快100倍可以使用openpyxl库至于怎么写,可以参考之前的文章:世界杯来了写一个爬虫获取玩家数据

因为很简单,这里就不赘述了可以作为初学者学习python的某种练习还可以通过pandas模块读取excel作为字典对象,然后直接存储在mySQL或者mongodb中,完全不需要导表的中间过程

郑重声明:此文内容为本网站转载企业宣传资讯,目的在于传播更多信息,与本站立场无关。仅供读者参考,并请自行核实相关内容。