Macro-Ods Excel Output

2019-10-21 17:17:38 浏览数 (1)

本文是上一篇文章的续篇,在前面已经提到过DDE,Proc export ,ods tagsets.excelxp输出Excel的程序、Macro。正所谓重量级的都是最后出场,今天的ods Excel输出方式大概是小编近期最后一次写输出Excel的文章,并非小编将所有的输出Excel的方法都讲完了,也并非小编对Excel输出已经登峰造极了,因为小编目前研究所掌握的已经够用,如果在深入的研究可能也没有太大意义,大概这就是小编心中的“平衡,取舍”之道了。由于吸取昨天的教训,代码太长,排版太丑,那么“好”的程序阅读量好少哎,也没有吸粉成功,小编的“2017千粉计划”眼看就要泡汤了哎,只好退而求其次,给自己定下了“2018万粉计划”!新年将至,预祝诸位元旦快乐,同样也预祝自己:让“梦想“的“梦”不是“白日梦”的“梦”,好像有点难,没有难度哪有成就感呢~

1

ods excel的优势

1、输出文件较小

利用ods Excel输出的xlsx文件较小,怎么来形容其小呢,小编今天尝试了113个数据集(大概65M)利用ods excel输出到一个xlsx文件里面,文件大小只有586k.而利用tagsets.excelxp输出大小为10M。

2、输出样式可自定义

不管是DDE还是tagsets.excelxp均可以实现对样式的设计,但是DDE使用起来较为繁琐(也可能是小编对此方式研究不够透彻),ods Excel的输出样式可以自定义话,与tagsets一样,可以在Template里面设计。

3、兼容计算

利用ods excel输出,在其中可以添加proc report等各种过程步,或者进行统计分析的画图的过程步,也可以将图像进行输出到Excel,进行精确的控制(小编对图形的输出暂无研究,日后如有机会会研究的)。

4、输出数据format的值

在上述几种方式中,“好像”只有export不可以输出format的值,为啥加“好像”呢,话不能说太死了,回头就被打脸不太好,因为小编不会用export输出变量显示的format,也看见很多人不会,如果你会,请你告诉我吧,我的求知欲还是很强的。以前将别人输出的讲数据集用一个Macro将颜色一个新的变量将format put过去的方式(New=put(old,format)) 这样转化在输出,我觉得比较low(纯属个人观点,勿喷).

5、随心所欲添加索引

重要的都是最后说,这个索引其实就是亮点,几乎上面的所有的输出方式都能添加索引,建一个目录实现跳转过去,跳转回来,但是要随心所欲,小编还是觉得ods Excel是最方便的。而本文也主要介绍的是这个。说到索引,顺便将一下小编去研究Excel输出是为什么,其实为的就是解决这个索引、目录的问题,小编的日常工作中经常会输出Excel形式listing,很多Excel的sheet,当然小编不是自己看,为了让用户体验感更好,是每一个负责人的programmer不懈追求的事(力所能及)。如果有索引就能实现快速的跳转的某个sheet,再从每个sheet跳转回到目录。方便别人就是方便自己。下面会引用一个10秒小电影来直观感受一下ods Excel实现索引的效果。

小电影

视频内容

请原谅我的手机录像比较low,效果大概是这样的,这个是小编语法基本测试成功后录下的一个视觉效果,可以实现Excel的快速跳转,又可以点击sheet的一个第一行返回到contents.视频中的效果并不是小编写的Macro最终输出的效果,因为在将语法完善成Macro的过程中,小编觉得还可以做的更美观和加一些其他的信息。正如很多公司一样,有专门的programmer对Macro进行维护和更新,一个好的Macro可能经历了长达数年乃至10年的维护,参与维护的programmer当然也会有很多。时代在变,需求在变,拥有Macro并没有太大价值(唯一的价值在于学习知识,与参考),做一个会写Macro的人才是真正的价值。因此小编将全面揭秘这个本次Macro编写的过程~

最终效果

Note:本来是是截图的,但是发现在有一些个人信息,小编懒了,就直接用手机补拍故意曝光过曝一下,掩盖一些背景信息。

2

正文:ods Excel Macro

1

明确Macro的目的

小编在写每一个Macro之前,都会明确Macro的目的与功能。如果是过于复杂的Macro,小编会将这一个Macro拆分成很多部分,最后将各部分组装到一起,为什么这么做呢,因为这样修改起来,调试起来很方便,哪儿有问题就到那个程序里面去修改。而且拆分成各个小模块如果以后再写其他程序或者Macro的时候是可以直接调用的,其实有这几点好处就已经很有必要将一个复杂,或者涉及知识点较多的Macro给拆分在组装。说到这儿就要说我们这些”码农”的本质了(SAS programmer 虽然并非IT行业的程序员,但是毕竟也是写代码,自称一下“码农”应该一点也不为过),写程序的本质其实就类似于SAS语言是一个比较强大的工厂(可以炼铁,也可以造汽车),我们就是工厂里面的工人,需要将各个零件组装成汽车,如果没有零件,我们就去造~

小编近2月写过或者更新过的Macro

NOTE:由上,可以见小编将很多Macro都拆分来写(如:rtf的输出,将截图有4个以rtf_开始的程序,在如dde,tag等),本次的ods excel的Macro也不例外,见上图是以exl_开头的程序均为本次的相关的Macro。

看到这些Macro你有想要的冲动么?要也不给

,你关注了小编的公众号了么,你将小编推荐给你学习研究SAS的朋友们了么,如果都有,你还应该反思一下,你打赏了文章了么,如果你打赏了,你还应该反思一下打赏的够不够

开玩笑的哎,如果有需要可以私下联系我哎,可能不会给你,但是会给你写的建议,不能再装逼了,其实小编写的Macro不多,也就这几个,小编也不是大神,也只能是互相交流互相学习。(期待有一天小编的Macro数据能过百

2

养成写注释的习惯

%exl_rep_ds注释部分

通过这张截图,就可以看出小编写的Macro是怎么使用的,宏参数有哪些,各个参数是干嘛用的,以及创建人等等一些描述性的东西,很容易让人看懂这个宏是功能,和版本。也建议大家养成一个类似的习惯,良好的编程习惯是对自己很有帮助的,因为每天都有大量的程序要写,可能你写的程序,你1个星期后能记得,1个月后能记得,但是半年后呢,一年后呢...因此注释很重要。小编的记忆和鱼类似,虽然不似鱼只有7秒,但是超过2周以上的程序健忘率高达50%,不记得当时为什么要那样写,不记得那样写的目的等等,都要想很久才能想起来或者根本想不起来,因此注释很重要~

%exl_sas2xls

NOTE:Macro的前面的说明,可以在程序写完后在写,但是参数的说明,还是建议在编写程序的时候就编写。Macro的宏参数,一般在写程序前会大致设计几个,然后在写的过程中不断完善,或者觉得没有必要可以删减,也可以设置参数的默认值。如这个,我就给几个宏参数设计了默认值(flag,contents_index)

3

定框架便于测试和调试

如果有人说,他的Macro是一气呵成写的,不用测试与调试,那么我是真的相当的佩服他的自信,如果哪一天小编能过做到这样,那么大概小编就得到成仙了~(关于想知道Macro调试的知识,请关注我的公众号后点击,进入公众号点击history,找到SAS-Macro编写调试....小编就不在这里说了)

定框架的前提是你有一定知识储备,这个知识储备就是,你大概要知道ods excel输出Excel的基本结构。和输出相关的option选项。如果你之前不懂相关的知识,就说 我想写一个什么什么功能的Macro,这样也不是不可以,但是你写之前肯定是要做功课将你需要用到的知识点弄懂,巧妇难为无米之炊就说这个道理。

小编的基本框架

小编的基本框架如上截图:很类似之前的tagsets的写法(如果看了我前面的一篇推送就会发现),我是先回tagsets.excelxp的,在此基础上在来学习ods Excel的,还是回到基本框架上来,小编写Macro基本上都这样的,先由外到里,在由里到外,最后Macro就会基本定型。我们可以发现控制ods excel输出其实是中间的proc report过程步,利用ods excel options(sheet_name=)来定义输出的sheet名称。由此小编就开始写proc report过程步的那个Macro,也就是%exl_rep_ds这个Macro。

Macro参数

前1/3部分代码

这个部分没啥好说的,看截图,注释横明确的的。好吧,还是多说几句,(%local :定义局部宏变量,只作用在当前Macro,%global:是定义全局宏变量,不能说是定义,应该用“申明”更加准备一些)本来还想说一下其他的宏函数,想一想还是不说了

第2/3部分代码

Proc report过程步: 为什么%if判断一下数据集是否有观测,如果用过report的同行,应该会知道如果report输出的数据集是空的,那么会是一片空白的存在,不太美观和好看。

这里重点来了!!!看截图,compute before _page_/里面的Url的设置,这里实现一个功能,那就是点击每个sheet的第一行的第一句话“click here ti return the contents”就会跳转到某一个sheet,为什么是某一个sheet呢,因为这里我用的Macro Var来代替的,如果改变宏参数的值,那么跳转到哪儿的sheet会随着变化,当然此处我是要跳转到第一个sheet,第一个目录的sheet.

后3/3部分代码

最后部分的代码,针对空数据进行处理,会插入一条记录,这里插入用的是proc sql的方法。在define的时候最后用noprint来不显示这个衍生变量。

4

组装

上面的report的Macro就这么简单的结束了,其实看起来简单,然则并不简单,如果对report不够了解,写起来也有些吃力。当然小编其实不太了解,了解的只是部分。官网一个report就可以写一本书,一个ods就可以写N本书。足见SAS的强大,经常在一些群里面看到别人吐槽SAS,其实吧,任何语言都只是工具,严格没有好坏之分,只有你喜不喜欢和感不感兴趣之分,小编是SAS的死粉,因为小编是靠SAS吃饭的人的。说多了,纯属个人观点。

%exl_sas2xls

第1/N部分

小编太懒了,就不去算N的值呢~如果你有兴趣,请留言告诉我N的值是多少~

这里有个语法:%do %while语法,真的很建议大家研究学习一下, %do %until语法 ,%do %to 语法, 建议大家都看看,小编的历史推送中的代码这些都有用到,分散的有点散,有兴趣可以找一找。这儿可以获取数据集名称以及sheet名称等等和循环次数。

第2/N部分

这一步其实就是为了做目录索引的,做目录索引的原理,其实就是一个数据输出在第一个sheet,然后添加URL实现跳转,大家千万不要被option里面的contents选项误导,小编就被这个option选项误导,浪费了大量时间研究,最终总结得出,contents选项很垃圾,不能让我随心所欲。

第3/N部分

这个截图里面的proc sql 是利用SAS数据集字典获取Table(你要输出的数据集中的观测数),另外也是定义ods 的输出路径和一些option选项

第4/N部分

这部分就是实现了目录和索引的功能。实现的方法其实和前面实现跳转会到某个sheet的方法是一样的。

第5/N部分

这个时候就用到了之前的report的宏,用了循环。着就是组装,Macro中调用Macro。

3

小编的辛酸史

小编写这个Macro遇到的最大问题就是实现跳转,前期被contents误导,后来猜出可以用一个数据实现跳转,这个时候又被一个计算的option函数误导,研究好久没有找到一个好的解决途径~最后不断的逛百度还是没有解决问题,知道进入了SAS官网的论坛,我才发现了新大陆~一个学习的全新方式,我真的不得不佩服国外的SAS编程水平之高,完全不是和国能在一个level上,看下面的截图。

这个论坛推荐给大家。当然关注我的公众号和逛论坛是一样有价值的

4

相关资料介绍

小编在学习过程中收集了大量书籍和资料。给大家截个图,如果有需要可以联系我,也可以关注公众后回复:exl即可获得程序代码等等等~等你消息喔~

0 人点赞