首页 > Unity3D频道 > 【Unity杂文】 > Excel工具升级版
2016
04-04

Excel工具升级版

hello各位,我又回来了~

上次发布工具后,得到了一些反馈,所以这几天给工具做了下升级~

老版本地址

http://www.xuanyusong.com/archives/3940

本次更新的内容有:

1.json添加精简格式,减小文件容量

2.支持二进制导出格式

3.添加联合主键功能

4.添加批注功能,可设置字典的默认key集合,并根据集合批量初始化单元格

5.添加plist和oc导出格式

现在做事情B格要高,才会受关注,所以我给工具起了个霸气的名字——滤查表。赞同我的请回复666~XD

下面介绍一下新功能:

json格式分为易读和精简两个版本,可通过bat中的第三个命令行参数控制,该参数可缺省,默认为0,此时为易读模式,若大于0,则导出精简模式,例:

Excel工具升级版 - 雨松MOMO程序研究院 - 1

 

导出后就是这个样子了

Excel工具升级版 - 雨松MOMO程序研究院 - 2

二进制格式应该不用过多解释吧,很常用的存储方式,读取效率高,占用空间少,唯一的缺点就是可读性差,不好调试。我在工具中写了lua、java和C#三种语言的解析接口,都放在bin目录中,可根据需要自行放到工程中。

Excel工具升级版 - 雨松MOMO程序研究院 - 3

解析后,java会返回一个ArrayList或者HashMap(根据主键设置),lua会返回一个Table,数据格式基本没有变化,只是java没有声明新的类,全部都存在哈希表中。通过读取二进制获得的数据,在使用上会比老方法变扭些,因为看不到数据(不过有打印接口,可以动态查看),可能会频繁查看excel表,但胜在运行效率高,如何取舍就看各位的喜好了~

最后说说很多人(包括松松)跟我提到的联合主键,因为我之前使用数据库不是很多,所以在工作中没接触过联合主键,但听他们的描述后,觉得还是个非常给力的功能,所以决定吸纳到滤查表中XD

所谓联合主键,就是可以通过某行数据的其中几个字段,定位到该行,从而获取其全部数据,相当于几个联合主键凑在一起,就可以起到主键的索引作用,这几个字段的表头就是该表的联合主键。

Excel工具升级版 - 雨松MOMO程序研究院 - 4

上图中的name和className就是该表的联合主键,如果你在程序中获得了Leonard和classHuman两个参数,就可以通过联合索引直接取到该行的数据(java是对象,lua是Table),作用和主键是一样的,时间复杂度也是O(1)。至于联合查找的接口:java和lua格式导出后会自动生成,通过unionGet(java)和表名+Get(lua)方法可取到索引结果,参数就是所有联合主键的对应值。二进制也会自动生成联合主键,但是没有公共的索引接口,需要用户在unionTable中通过手动生成的联合键查找,生成规则为所有主键以字符串形式拼接,中间以下划线分割,例如上图中的联合键就是:Leonard_classHuman。至于unionTable,是在解析二进制文件后生成的,会保存在DBBinary.s_unionTable中。json格式我没有写解析方法,主要是因为json的原生支持语言是js,而我不会写js代码,所以就没做,至于其它语言,可以从它们各自生成的解析代码中拷贝。

设置方法:选中要设为联合主键的列,见下图

Excel工具升级版 - 雨松MOMO程序研究院 - 5

 

下图中红框区内的按钮就是联合主键操作键,set是将所选列设为联合主键,del则是取消

Excel工具升级版 - 雨松MOMO程序研究院 - 6

代码中的索引函数

Excel工具升级版 - 雨松MOMO程序研究院 - 7

lua联合索引方法

Excel工具升级版 - 雨松MOMO程序研究院 - 8

java联合索引方法

Excel工具升级版 - 雨松MOMO程序研究院 - 9

二进制在java中的应用范例

Excel工具升级版 - 雨松MOMO程序研究院 - 10

二进制在lua中的应用范例

再有就是我写的二进制读取方法只是针对滤查表的,其实从设计角度讲,应该是先写出基础的二进制读取,再在上层针对具体需求进行封装,但是我觉得自己写的方法并不是很完美,加上很多语言都有读取二进制的API,所以就没敢越俎代庖~有雄心壮志的同学可以自己封装一下~

小齐童鞋之前提到一个问题,就是策划手动填写字典的key值容易出错,因此我加了一个批量生成字典单元格的功能,使用方法如下:

假如我们有一列单元格,类型为字典,并且所有行的key都是min和max(固定的),那么我们给该列的类型单元格添加批注,内容就是“min;max”,见下图

Excel工具升级版 - 雨松MOMO程序研究院 - 11

然后确保该列的单元格都为空(有内容的单元格不会有效果),点击InitDictCells按钮,此时该列的所有单元格就都被初始化为“min=0;max=0”了,策划只需将0改为真实值即可,这样便大大降低了出错几率。此外可通过点击ShowComment按钮显示所有的批注,虽然Alt+R+A也有类似功能,但它是显示全部的批注,而ShowComment只显示第二行(类型行)的批注。最后感谢小齐的建议哈~

Excel工具升级版 - 雨松MOMO程序研究院 - 12

再次点击ShowComment就会隐藏批注。

滤查表下载地址

http://pan.baidu.com/s/1eSvzgaQ

全部文件

Excel工具升级版 - 雨松MOMO程序研究院 - 13

最后编辑:
作者:失落的宇宙
人的生命是有限的,但bug是无限的,我要把有限的生命投入到无限的改bug事业中去~
捐 赠如果您愿意花20块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。

Excel工具升级版》有 43 条评论

  1. 郭浩 说:

    能否增加对中文的支持呢?或者给出源码 我自己修改也可以的工具真的很好用 帮了大忙了 谢谢

  2. 山谷里的渔民 说:

    导出为protobuf的bin可以更小。

  3. 曹宇翔 说:

    能给个package范例吗

  4. 宏哥1995 说:

    这个东西很强大啊,有两个问题希望能修复一下:1.中文乱码问题,毕竟中文数据太常见了。2.数据读取问题,例如将例子的第一个表导出c#,读取数据就是openFile(“Template_Player.bin”);,显然这个路径是不能直接用的,建议改为path XXX.bin,增加一个变量

  5. 宏哥1995 说:

    这个东西很强大啊,有两个问题希望能修复一下:1.中文乱码问题,毕竟中文数据太常见了。2.数据读取问题,例如将例子的第一个表导出c#,读取数据就是openFile(“Template_Player.bin”);,显然这个路径是不能直接用的,建议改为path+XXX.bin,增加一个变量

  6. 毒药 说:

    像这个格式的要怎么做:
    [“item”] = { refId = “item”, property = { name = “草”, description = “采集物”, iconId = “item”, smallIconId = “item”, quality = 1, bindType = 1, itemSortId = 100, itemType = 3, canUse = 0, canBatchUse = 0, maxStackNumber = 9, isNonPropertyItem = 0, isCanSale = 1, salePrice = 10, saleCurrency = 1, isNonThrow = 1, useLevel = 1, useKnight = 0, useCountEveryday = 0, itemCDGroup = -1,},
    effectData = “”, useItemClosure = “”, putItemClosure = “putItemClosure”,},

  7. 毒药 说:

    像这个格式的要怎么做:
    [“item”] = { refId = “item”, property = { name = “草”, description = “采集物”, iconId = “item”, smallIconId = “item”, quality = 1, bindType = 1, itemSortId = 100, itemType = 3, canUse = 0, canBatchUse = 0, maxStackNumber = 9, isNonPropertyItem = 0, isCanSale = 1, salePrice = 10, saleCurrency = 1, isNonThrow = 1, useLevel = 1, useKnight = 0, useCountEveryday = 0, itemCDGroup = -1,},
    effectData = “”, useItemClosure = “”, putItemClosure = “putItemClosure”,},

    • 你好,感谢你的支持,但是你描述中的property是多类型的复合字典,本工具目前之支持单一类型的字典,你可以把property抽象成一个类,为它新建一个表,然后在本表中建一个字段,通过数据有效性指向新建的表

    • 或者把property里的字段提出来,减少一个层级也可以,因为我看里面的参数都是固定字段,不会有太大变数,个人感觉没必要做成一个集合[呵呵]

  8. 毒药 说:

    中文转出到LUA乱码,我选的类型为string

  9. 已添加plist和oc导出功能

  10. 已更新,添加了C#格式,字典批量初始化功能(感谢小齐的建议),带有主键的表格导出json时,如主键是int类型,会自动转为string

  11. 胡良云 说:

    雨松大大,请问如果要把Unity程序中的调查问卷的数据导出为Excel图表又该如何做呢?我最近要做一个Unity3d的互动系统,这个系统是运行在一体机上面的,也就是说没有键盘外设,其中有一个调查问卷,需要用户输入姓名和电话。1.我该如何调用系统的触摸键盘以及输入法?2.如何将调查问卷的数据保存下来?我是U3D新手,现在没有太好的思路,希望大大不吝赐教!

  12. 抱歉昨天上传的版本有点问题,在lua中读取二进制会报错,我已重新上传,麻烦已经下载过的朋友再重新下载一遍,sorry……

  13. c6u2 说:

    我一直在设想做个这样的插件,在UNITY里编辑,不需要开其他的编辑工具。策划程序查询数据和修改保存成数据都在UNITY下,编辑的结果会直接体现到游戏里,但是别人和我说这样太耦合了,等于强制了策划必须去使用UNITY,我想想也有道理,所以暂时还是用第三方的工具编辑数据,然后导出成2进制数据在UNITY里解析。

  14. c6u2 说:

    绿茶婊- -[威武]

留下一个回复

你的email不会被公开。