视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
DDE技术介绍
2025-09-24 06:31:28 责编:小OO
文档
Hello Word! SAS统计报表-动态数据交换(DDE)技术介绍(1)

将sas的统计分析结果输出到Word文档中,实现起来并不复杂,利用SAS提供的ods(Output Delivery System,输出传递系统),可以很方便的将结果输出到.rtf(也就是Word格式文档)、.html(网页)以及PDF文档中。

最简单的实现:

ods rtf file="filepath:docname.rtf";

proc step

...

ods rtf close;

然后非常不幸的是,上述输出结果是系统默认的,是SAS系统已经预定义好的格式(几乎所有的情况下都不符合我们的要求),如果想用ODS系统实现统计报表的定制输出,实现过程就要复杂的多。

事实上,运行在OS/2及Windows操作系统下的SAS系统,还有另外一种与其它应用程序交互的技术,那就是Dynamic Data Exchange,动态数据交换技术,简称dde。

DDE与ODS最大的不同在于,DDE的实现过程相对透明且是实时交互,而ODS则是将所有输出结果“打包”后按固定格式(除了print,report和tabulate这三个过程)输出。做个不大恰当的比方,DDE就好像买电脑时的攒机DIY,每个散件你可以自己挑,而ODS则是只卖整机,虽然ODS也允许你定制,但给你的只是整机。

DDE与ODS在统计报表中都有应用,但作为两种不同的技术,无所谓孰优孰劣,我只关心利用它们我能实现什么。统计报表的输出,最重要的是规划统计表的结构,以及表格中每个单元格的数据和它的形式。利用ODS可以获取需要的数据集,修剪之后,再利用proc template定制的表格,可以实现自定义输出,但在数据的细节上,比如最常用的卡方检验,频率及百分比的输出,如果要用template定制的table将上述两个数据输出到一个单元格,格式为N(m%),那是很困难的。但应用DDE技术,你可以实现对Word文档的完全操控,特别是那些细节之处,而需要你掌握的WordBasic语句并不多。

好了,字数也码得差不多了,来看一个例子:一个宏程序,打开一个空白的Word文档,然后建立一个名为docname,路径为filepath的Word文档。

%macro helloword(filepath,docname);

/*** start word application ***/

options noxsync noxwait xmin;

filename cmds dde 'winword|system';

data _null_;

length fid rc start stop time 8;

fid=fopen('cmds','s');

if (fid le 0) then do;

rc=system('start winword');

start=datetime();

stop=start+10;

do while (fid le 0);

fid=fopen('cmds','s');

time=datetime();

if (time ge stop) then fid=1;

end;

end;

rc=fclose(fid);

run;

/*** define the document name and the file path ***/

data _null_;

file cmds;

put '[FileClose 2]‘;

put ‘[FileNew.Template="Normal.dot"]‘;

put ‘[ChDefaultDir "'"&filepath"'",0]‘;

put ‘[FileSaveAs.Name="'"&docname"'",.Format=0]‘;

put ‘[AppMinimize]‘;

run;

%mend;

比如,我要在C盘myfile目录下建立一个名为output.doc的文档:

%helloword(c:\\myfile\\,output);

然后,我要在这个Word文件中写几个字,然后保存:

data _null_;

file cmds;

put '[Insert "Hello Word!"]‘;

put ‘[FileSave]‘;

run;

需要注意的是,上述目录必须存在,否则Word会报错,因为它不会创建目录。

文本与表格 SAS统计报表-动态数据交换(DDE)技术介绍(2)

使用sas的dde将文本写入Word文档,最常用的就两个WordBasic命令:Insert和InsertPara

看下面的这个例子:

%helloword(c:\\,example); /*注:1*/

data _null_;

file cmds;

put '[Insert "我的第一个例子"]‘; /*注:2*/

put ‘[InsertPara]‘; /*注:3*/

run;

1:调用宏程序helloword,在C盘上建立一个名为example的Word文档

2:将“我的第一个例子”这几个字插入到上述文档当前光标的位置,也就是文档的第一行

3:插入一个段落标记,此时Word中的光标已经下移到第2行

怎么样,用DDE将文本写入Word文档比较简单吧,用英文的双引号将文本引起来,利用Insert命令就直接将这些引用的文本插入到文档中了。如果此处的文本是一个宏变量,或者是一个宏程序中的参数,引用的格式稍有不同,实际上在宏程序helloword中就有这种情况:

put '[ChDefaultDir "'"&filepath"'",0]‘;

put ‘[FileSaveAs.Name="'"&docname"'",.Format=0]‘;

我们可以看到,对宏变量及参数的引用,使用的是英文的双引号单引号双引号“‘”将宏变量或参数引起来,在执行的时候宏变量或参数先被赋值然后执行,此时的宏变量或参数无需加双引号。如果定义宏变量或给参数赋值时加双引号,则使用双引号单引号“‘。

接下来(把下面这几句插入到上面程序中Run;的前面):

put '[Insert "表格1"]‘;

put ‘[InsertPara]‘;

put ‘[Insert "单元格1"+chr$(9)+"单元格2"+chr$(9)+"单元格3"]+[InsertPara]‘; /*注:4*/

put ‘[Insert "单元格2-1"+chr$(9)+"单元格2-2"+chr$(9)+"单元格2-3"]+[InsertPara]‘;

put ‘[EndOfDocument]‘; /*注:5*/

put ‘[ParaUp 2,1]‘; /*注:6*/

put ‘[TextToTable.ConvertFrom="1",.NumColumns=3,.NumRows=2,.InitialColWidth="Auto",.Format="4",.Apply="63"]‘; /*注:7*/

put ‘[FileSave]‘;/*注:8*/

我们来看看这几个语句的意义:

4:这个语句中出现了chr$(9),其实这个就是制表符,为将来表格的形成做准备;另外,这个语句还有一个不同之处,就是在单引号中有两对方括号,即在一个put语句中可以写多条WordBasic命令,每个命令用一对方括号括起来。

5:看这个命令的英文,我们就大概能猜出来,将光标放到文档的最末尾。当然,这个语句在这里其实没有用,因为光标已经在文档的末尾,我们只是为了举例。

6:这个语句也很好记,向上移动光标,移动的最小单位是1行。它有两个参数,第一个参数是向上移动的行数,第二个参数表示是否选取,1表示选取当前光标至光标移动后所在位置的所有文本及控制符,0表示不选取,仅移动光标。[ParaUp 2,1]即表示选取当前光标上面的2行。

7:在6中我们已经选择了2行文本及其间的制表符,这一句就是把已经选取的部分,转成表格,这个命令和WORD表格工具中的选择->文本转换成表格其实是一样的。TextToTable后面的几个参数是转换过程的具体控制,基本上从字面的意思就可以理解出来,以后如果有时间会详细介绍这些参数的使用。

8:文件保存。下载本文

显示全文
专题