首页 > Unity3D频道 > 【Unity杂文】 > Excel辅助开发工具
2016
03-30

Excel辅助开发工具

好久没来松松的研究院了,今天回来转转,写写文章,不知道还有人记得我吗= =(记得上次来还是伦敦奥运会,这次已经该巴西了……)

什么,已经忘记了吗,没关系,当我是神经质路人好了XD

 

今天跟大家分享一套Excel的辅助工具,该工具集数据编辑和转换于一身,可将Excel中的数据直接转换为代码(目前支持lua、java和json)。最重要的是:该工具由我个人编写,文章也是原创,所以不用担心版权问题~(转载请注明出处)

在介绍工具之前先说一下开发它的目的:

相信从事过游戏开发工作的童鞋都使用过Excel吧,由于其强大的功能以及简便的操作,几乎已经成为了游戏策划填写数值的标配(当然也有一些开发大牛会自主开发编辑器,但是由于开发成本较高,一般中小型公司很少会这样做)。既然是用excel写数值,那么如何将表中的数据传输给游戏本体,便是所有程序员都要处理的问题。当然要解决这一问题并不难,导出csv,用其它解析工具解析excel都可以,真正的重点是如何高效、完整的读取数据——这还不是最麻烦的,真正让无数程序猿头疼的问题估计还是如何避免策划填写错误(我猜很多程序猿都有因为策划填错数值导致程序出错而和策划撕逼的经历吧)。而我写这个工具,初衷就是为了解决这两个问题,当然我也很清楚这个工具并不完善,还有很多需要改进的地方,在这里分享只是希望能提供大家一个思路,希望能和有经验的朋友互相切磋~

首先说说解析数据的方法,我最早的那家公司在这方面还是很有建树的,当时的主程自行编写了一个辅助工具,可将表格中的数据转到一个xml文件中,再用一个转换器将其转为二进制,放入游戏包中;在编辑数据时,也支持数据有效性,使策划可以用下拉列表来选择数据。但这个工具有个致命的缺点,就是——慢!不光是导出数据慢,安装工具也很慢,甚至有的时候会安装失败……因为该工具是以插件的形式嵌入到excel中的,所以效率很低,因此我决定不再沿用这种做法(但不管怎么说它给了我很大启示,我自己写的工具也很大程度上借鉴了它的理论,感谢老公司的大大)。后来我又采用了excel导出csv,再将csv转为游戏数据的方式,这么做虽然很快,但也有问题:1.导出的中间步骤较多,excel导出的文件并不能直接使用,虽然是一键导出,但只要操作频繁,就难免会出错,而且策划自行测试时也不方便;2.为了避免手动另存为csv,一般来说都会将导出功能做成一个按钮,但是excel中的按钮只能摆放在表格区,一来比较丑,二来随着表格的增删,按钮可能会经常挪动,用起来也很麻烦。于是我取消了csv,采用直接用工具解析excel的方式,但不巧的是我编写工具的语言是C#,解析表格时用到了.net库,这无形中又增加了成本——策划必须安装.net framework才能使用,而且也会出现无法安装的现象,最终又被pass了……

比起解析,我觉得开发中最大的问题还是——填.错.数.值!

比如一个道具表,里面有一列代表道具的图标,假如一个道具的图标资源叫icon,但是策划手误写成了ion,那么程序运行的时候肯定会找不到该资源,最终导致崩溃或异常。很多程序都因为这个和策划互喷过吧,其实我到觉得填错数值很正常,人不是机器,是人就会出错,即使是我们自己去填也难保百分百正确,何况是不懂程序的策划呢(有时我还真挺可怜他们的= =)。既然知道了问题,那么就应该想办法解决它,而不是事后去抱怨,既然我们知道策划会填错数,那么为什么不去想办法去降低他们出错的机率呢,我觉得这才是程序猿真正该做的事,也是我们的价值所在。

综上两点,最终我想出了这套解决方案,当然还有不足之处,对于上面提到的问题,也并非全都能完美解决,但我已经尽了最大努力,相信还是可以解决90%的问题的~

抱歉这次废话有点多= = 接下来说重点,介绍下这套工具:

本工具的基本原理是:先通过excel表内置的vba代码生成csv文件,再用外部工具将数据转为需要的格式。大家可能会问,这不还是要生成csv吗?是的,的确是这样,但是我为了便于操作做了一些补救措施,望各位不要急于吐槽,先往下看~

Excel表的格式是这样的

Excel辅助开发工具 - 雨松MOMO程序研究院 - 1

大家有没有注意到上方的选项卡,最右侧多了一个Tools?这是我自定义的选项卡,里面的按钮也都是自己定制的,用来实现一些辅助功能,因为该表格我设定了一些自己的规则,为了配合这些规则,不给使用者带来额外的麻烦,所以做了一些针对性的工作,将其“风格化”。所有这些功能都是用vba实现的,excel天生支持vba,所以稳定可靠,不会像插件那样出现各种问题~

表格的正文部分,我的设计是这样的:采用双表头格式,即用两行来定义数据,第一行是字段名,第二行是字段类型。如果使用自定义的新建标签页按钮的话,创建的新页默认就是这种格式,以避免用户使用错误。数据的基本类型有int,float,bool,string四种,且每种都有数组和字典两种集合类型( []和{} ) ,null为特殊类型,标记为null的列不会导出,可作为注释使用。所以可以选择的全部类型有:

null, int,float,bool,string, int[],float[],bool[],string[],int{},float{},bool{},string{}

当类型为数组时,多个子数据之间用;间隔,长度为不定长,写几个就是几个,只要符合业务逻辑即可,但所有子数据必须是同一类型,泛型数组暂不支持……单元格可以为空,此时代码中索引该值的返回值就是空数组或null(视语言而定)。

Excel辅助开发工具 - 雨松MOMO程序研究院 - 2

resist字段就是一个int数组,该行的值有5个元素,内容都是3

当类型为字典时,子数据之间依然用;分割,只是多了一个key值,写法如下:

Excel辅助开发工具 - 雨松MOMO程序研究院 - 3

等号前面的即为键值,后面的是value,字典也同样可以为空。

单一类型的数据也是可以留空的,但是导出后会赋予默认值,int和float是0,bool是false,string是””

接下来说说数据有效性的使用:

我们在填表格的时候经常会遇到在固定几个数值中单选的情况,比如性别一栏,只有男和女,二选其一(另类游戏的特殊需求暂不考虑哈),那么问题来了,如何填数值呢?一般来说程序猿习惯用数字表示,比如男0女1,但是策划往往更希望直观的填写,即字符串”男”和”女”,但是这样的话程序在匹配时会降低效率(字符串比较比数值比较要慢得多),这个时候数据有效性就可以鱼和熊掌兼而得之。

先说下设置方法,首先圈选一列(或者多列也可以),选择数据选项卡,点击数据有效性->数据有效性,如下图

Excel辅助开发工具 - 雨松MOMO程序研究院 - 4

之后会弹出下图所示窗口,将有效性条件选为序列

Excel辅助开发工具 - 雨松MOMO程序研究院 - 5

在来源中填写男女,中间用半角的逗号分割

Excel辅助开发工具 - 雨松MOMO程序研究院 - 6

这样选中列的有效性就被设为了男和女,数值只可能是这二者中的一个,当点击单元格时,右侧会出现下拉箭头,点击后就会出现选项,如下图

Excel辅助开发工具 - 雨松MOMO程序研究院 - 7

此时不需要手动输入,只需选择一个即可,这样一来策划就不可能填错了~~

但是仅仅如此还不够,策划的问题解决了,但是程序识别的依然是字符串,那么该怎么办呢?还记得前面提到的数据类型吗,此时只要将该列的类型设为int,那么数据导出后,这一列的所有数值都是整型,但是这个值是怎么转化来的呢?其实就是你所选的选项的索引,男就是0,女就是1,这样一来策划方便,我们也不必担心效率了~中间的转换过程是我用VBA实现的,VBA是excel原生的脚本语言,效率可以保证,也不用安装额外的插件(只是在安装office的时候记得把工具库装上)。

其实第二行的数值类型也是用这种方法设置的,不信你可以随便点击一个类型的单元格,看到的结果一定是这样~

Excel辅助开发工具 - 雨松MOMO程序研究院 - 8

这样类型就被限定死了,策划们永远不可能自定义出新的类型来~当然由此我们也可以推断出,带有数据有效性的列只能是int或string,不能是其它类型。

前面说的是自定义的有效性,还有一种以某个现有序列为范围的有效性,举个例子:有一个角色拥有一个技能,角色的属性定义在角色表中,技能的属性定义在技能表中,角色表有一个字段存放的是他的技能ID,用来表示他有哪些技能,我们在程序中通过该值索引到对应的技能,在技能表中获取该技能的参数。通常的做法是策划在角色的技能栏中填写技能ID,但是如果该ID值和技能表中的ID不一致(策划又手误了),就会出现bug,要么空指针,要么指向了另一个技能,从而带来额外的工作量。这个时候可以这么干:

Excel辅助开发工具 - 雨松MOMO程序研究院 - 9

还是打开有效性设置窗口,但是这次我们不手动填写,而是点击上图红框中的按钮,进入这个界面

Excel辅助开发工具 - 雨松MOMO程序研究院 - 10

在这里我选的是desc列,点击确定后再选择一个单元格看看~

Excel辅助开发工具 - 雨松MOMO程序研究院 - 11

这一列的单元格也有数据有效性了,范围就是刚才我们选的那一列,只是多了两行表头,因为我们是整列一起选的,如果只选择后面的部分,就没有表头了,但是范围无法随着行的增减自行同步,excel又不支持减法操作(即先选整列,再减去前两行的做法),所以这里采用了整列选取的方法,只需注意别选前两项即可。还有一点就是只有2010以后的版本支持跨表设置有效性,老版本只能在本标签页内设置,因此强烈推荐使用2010以后的版本。

表的大体原理已经介绍的差不多了,接下来再说说功能区的控件功能:

Excel辅助开发工具 - 雨松MOMO程序研究院 - 12

Tools选项卡共有6个组,分别是:Export、Check、Format、Surface、Crearor和PrimaryKey

Export用于导出,ExportAll是导出全部标签页,每个标签页会生成一个csv文件,ExportThis是导出当前标签页。这样一来导出按钮就被固定了,不用再像以前那样四处漂泊~

Check组的作用是补齐默认值,点击Valid后,当前页所有带有数据有效性且留空的单元格,都会填上默认值(序列的第一个元素),点击Value后,没有有效性且留空的单元格会填上默认数值(规则见上方)

Format的作用是把表格标准化,去除不合法的元素,LineValid会把当前页最下方数据全为空的行删除,All是删除所有标签页的不合法行,以免解析报错。Validation是初始化头两行的数据有效性,因为给列设置有效性后,该列前两行的有效性也会改变,用这个按钮可还原。

Surface主要是和显示有关,LineColor可以给每行填充不同的颜色,以便于区分,如下图:

Excel辅助开发工具 - 雨松MOMO程序研究院 - 13

RemoveColor就是还原行颜色,AddFrame是添加边框线,removeFrame是取消边框线,CellAlign是当前页所有单元格居中对齐FreezePanes是冻结首行和首列,这样当数据滚到末端时,依旧能看到行和列名。

Creator是创建新数据用的,NewSheet是新建标签页,建好的Sheet默认为我们的excel格式,有两行表头,第二行有数据有效性,所以建新表时,建议用此按钮来代替传统方式;NewRow和NewColum是新建行和列

PrimaryKey是设置主键用的,每个表的第一列可设为主键,设置后,该列黑体显示,并且作为唯一标识,在代码中可通过其值直接索引到对应的行,如果没有设置,则自动按照行号来分配到数组中(第三行就是第一个元素,首个元素下标由语言决定),如果索引值是 string或者不连续的int,那么就必须设置主键才能正确找到位置。

成功导出CSV文件只是第一步,之后我们还要将其转为真正的游戏数据,完成这一步的工具是DataConverter.exe,它可以将csv转为lua、java或者json中的任意格式,因为为了开发便捷,我们更喜欢服务器和客户端共用一套表格,所以我们直接用工具把csv转成不同的格式即可,build_java.bat、build_lua.bat、build_json.bat就是针对不同格式调用工具的批处理,直接双击即可,生成的文件会放在对应的文件夹里,如图:

Excel辅助开发工具 - 雨松MOMO程序研究院 - 14

生成的lua代码

Excel辅助开发工具 - 雨松MOMO程序研究院 - 15

如果是java格式的话,会生成两组文件,一个是.java,一个是.bin,每个标签页对应一个.java和一个.bin,即一个标签页就是一个类,bin是对应的数据,可以通过get方法获取表格数据,数组以[]的形式保存,字典则保存为HashMap,注意所有类都有个共通的父类DBBase.java,也要一并放入工程。

其实最近觉得用二进制来存储数据也是不错的选择,更加轻便,读取效率也高,只是可读性差一些,过段时间我再把二进制转换功能也加进来~

这次写的内容比较多,如果只是介绍工具的话其实不用写那么多的,我是想阐述一下自己的观点,希望能和有兴趣的朋友共同切磋~

工具下载地址

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

压缩包中的文件

Excel辅助开发工具 - 雨松MOMO程序研究院 - 16

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

--

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

  1. 雨松大哥你好,你网盘里的 template 里那个 tools -> lineColor功能,点完就无响应了,必须切换 sheet 才能继续编辑,这好像是 vb 写的问题,可我并不会看,能修复发个新版 template吗?

  2. 发现楼主转成json不是最小数据格式, 虽然序列化成助于阅读格式,但是这样有些浪费空间. 希望能够提供选项, 转成最小格式