首页 > 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

雨松MOMO提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!

--

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

  1. 松总,得创新下了,我在寻找一个直接使用 UnityEditor 读取 excel 表 并且能 导出 json,如果可以强大一点还能直接修改 excel 源文件,例如调试数值的时候比较方便.

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

    • 1.其实导出中文并不是excel的职责,仔细想一下就会明白,为了应用能够支持多语言,但凡开发流程正规的公司都是不允许在代码中直接出现中文的,都是给出key,再到其它地方去索引文字,因此excel其实是没有必要导出中文的……不过为了使它的应用范围更广,有时间我可以修正一下~ 2.你在前面加个常量就行了,当时图省事就没有写,等闲下来我改一下

  3. 像这个格式的要怎么做:
    [“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抽象成一个类,为它新建一个表,然后在本表中建一个字段,通过数据有效性指向新建的表

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

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