- 最简洁的:proc export(无法输出format)
- 最常见的:ods tagsets.excelxp(输出的文件超级大动辄数百兆)
- 最强大的:SAS DDE输出(功能多而全,输出文件较小)
DDE输出也是我最近get到的新技能,由于之前一直Tagsets输出Excel发现Tagsets输出有一些弊端,在数据量非常大的时候运行时间长,而且文件也会被放大。最近恰巧从朋友那儿看到了DDE输出相关的程序,然后就开始学习研究,目前也是一直半解,如有不当之处还望指正。
如何实现通过DDE的方式进行输出数据集呢,
- 首先需要启动Excel
0.0 很多文献和相关资料都是这样写的(代码如下)为啥这样写,我也不知道,
反正能达到打开Excel的目的。
options noxsync noxwait;
filename sas2xl dde 'excel|system';
data _null_;
length fid rc start stop time 8;
fid=fopen("sas2xl",'s');
if (fid le 0) then do;
rc=system('start excel');
start=datetime();
stop=start 10;
do while (fid le 0);
put fid;
fid=fopen("sas2xl",'s');
time=datetime();
if (time ge stop) then fid=1;
end;
end;
rc=fclose(fid);
run;
- 接着就是新建一个Excel文件:
data _null_;
file sas2xl;
put '[error(false)]';
put '[new(1)]';
put '[save.as("E:Class.xlsx")]';
put '[file.close(false)]';
run;
x "E:Class.xlsx";
- 接着就是运用filename向Excel里面写内容:
filename recrange dde "excel|Class.xlsx]sheet1!r1c1:r1c6" notab;
data _null_;
file recrange;
put "SEX " '09x';
run;
filename recrange dde "excel|Class.xlsx]sheet1!r2c1:r2c6" notab;
data _null_;
set sashelp.class;
file recrange;
put SEX '09x';
run;
注释:"excel|Class.xlsx]sheet1!r1c1:r1c6"中class.xlsx为新建Excel名称,sheet1为新建Excel里面激活的一个sheet也是向里面写数据,后面可以通过rename来实现自定义sheet名称。r表示第几行,C表示第几列,:表示 “至” 。。这样就可以精确的控制你要输出的数据随心所意的放在Excel的中的那个位置了。第一个filename 是先将变量名输入到Excel 或者label名称输入到Excel。
在真正输出的过程中,操作方法如下:
1.先获取待输出数据集的变量结构,proc contents 或者sql 中的数据集字典的方式 获取变量的label/变量名称然后通过复制给一个宏变量,通过第一个filname将变量名给输出到Excel
2.第二个filename是为为了将数据集需要输出的数据进行输出,这个时候我也通过赋值宏变量的方式进行操作,因为写成宏以后只用填写数据集和输出路径就可以实现输出。
- 放完数据后呢,我们就可以调整Excel格式啊,字体样式啊,是否筛选啊等等(这部分具体操作见文末赋上的网盘地址中关于DDE输出很经典的PDF的书以及一个SAS程序的例子里面很全喔)
- 最后呢,就是保存Excel:
filename end dde "excel|system";
data _null_;
file end;
put '[workbook.name("Sheet1","UK")]';
put '[save]';
put '[quit()]';
run;