SAS到Excel DDE生成测试数据,但不输出数据

SAS到Excel DDE生成测试数据,但不输出数据,sas,dde,sas-studio,Sas,Dde,Sas Studio,我一直在线关注文档并浏览其他堆栈溢出查询,但还没有找到通过DDE将SAS数据集输出到excel的方法 我正在运行的SAS版本是SAS9.4 我正在运行的excel版本是microsoft office 2016-excel 2016 我用来导出的代码是 /*Excel DDE interface options*/ /*TEST*/ options noxwait noxsync; X '"C:\Users\user.name\Desktop\template_dde.xlsx"'; dat

我一直在线关注文档并浏览其他堆栈溢出查询,但还没有找到通过DDE将SAS数据集输出到excel的方法

我正在运行的SAS版本是SAS9.4 我正在运行的excel版本是microsoft office 2016-excel 2016

我用来导出的代码是

/*Excel DDE interface options*/ /*TEST*/
options noxwait noxsync;

X '"C:\Users\user.name\Desktop\template_dde.xlsx"';

data _null_;
    rc=sleep(15);
run;

filename ddedata dde 'excel|SFA!r2c1:r4000c56';

data _null_;
    file ddedata notab;
    set work.Results_output_format end=eof;
put '"THIS IS A TEST"';
run;

%LET timestamp = %SYSFUNC(PUTN(%SYSFUNC(DATE()),yymmddn8.));
%LET hourstamp = %SYSFUNC(COMPRESS(%SYSFUNC(TIME(),time.),%STR( :)));

data _null_;
    length cmnd $150.;
    file ddedata;

    cmnd = '"[save.as("C:\Users\user.name\Desktop\&timestamp._&hourstamp._template_dde.xlsx")]"';
    put cmnd;
    put '[quit()]';
run;
它输出“这是一个测试”,然后输出save语句,但我的数据没有导出,文件也没有实际保存


我忽略了什么吗?

集合不会隐式地将数据集内容放在Excel文件中。您需要使用
PUT
语句将数据添加到工作表中。您还需要使用单独的文件名向
Excel |系统
频道发送命令

您的代码在尝试的宏变量解析周围有单引号,这是不正确的

此代码假定存在一个现有工作簿
c:\temp\template\u dde.xlsx

* open template in Excel;
X '"C:\Temp\template_dde.xlsx"';

* wait for app to start and file to load;
data _null_; rc=sleep(3); run;

* define filerefs for data transfer and command execution;
filename ddedata dde 'excel|Sheet1!r2c1:r4000c56';
filename ddecmnd dde 'excel|System';

* pump data into excel cells at location specified in ddedata;
data _null_;
  file ddedata ; * <--- removed your NOTAB option, so now I dont have to put '09x' between each variable;

  set sashelp.class;
  put name sex age height weight; 
run;

* Extended ISO timestamp as yyyy-mm-dd_hh-mm-ss;
%let timestamp = %sysfunc(translate(%sysfunc(datetime(),E8601DT),%str(_-),%str(T:)));

* send commands to save workbook and close Excel;
data _null_;
    file ddecmnd;

    put "[save.as(""C:\Temp\&timestamp._template_dde.xlsx"")]";
    put '[quit()]';
run;
*在Excel中打开模板;
X''C:\Temp\template_dde.xlsx';
*等待应用程序启动并加载文件;
数据为空;rc=睡眠(3);跑
*定义用于数据传输和命令执行的文件引用;
文件名ddedata dde'excel | Sheet1!r2c1:r4000c56';
文件名ddecmnd dde“excel |系统”;
*在ddedata中指定的位置将数据泵入excel单元格;
数据为空;

文件数据;* SET不会将数据集内容隐式地放置在Excel文件中。您需要使用
PUT
语句将数据添加到工作表中。您还需要使用单独的文件名向
Excel |系统
频道发送命令

您的代码在尝试的宏变量解析周围有单引号,这是不正确的

此代码假定存在一个现有工作簿
c:\temp\template\u dde.xlsx

* open template in Excel;
X '"C:\Temp\template_dde.xlsx"';

* wait for app to start and file to load;
data _null_; rc=sleep(3); run;

* define filerefs for data transfer and command execution;
filename ddedata dde 'excel|Sheet1!r2c1:r4000c56';
filename ddecmnd dde 'excel|System';

* pump data into excel cells at location specified in ddedata;
data _null_;
  file ddedata ; * <--- removed your NOTAB option, so now I dont have to put '09x' between each variable;

  set sashelp.class;
  put name sex age height weight; 
run;

* Extended ISO timestamp as yyyy-mm-dd_hh-mm-ss;
%let timestamp = %sysfunc(translate(%sysfunc(datetime(),E8601DT),%str(_-),%str(T:)));

* send commands to save workbook and close Excel;
data _null_;
    file ddecmnd;

    put "[save.as(""C:\Temp\&timestamp._template_dde.xlsx"")]";
    put '[quit()]';
run;
*在Excel中打开模板;
X''C:\Temp\template_dde.xlsx';
*等待应用程序启动并加载文件;
数据为空;rc=睡眠(3);跑
*定义用于数据传输和命令执行的文件引用;
文件名ddedata dde'excel | Sheet1!r2c1:r4000c56';
文件名ddecmnd dde“excel |系统”;
*在ddedata中指定的位置将数据泵入excel单元格;
数据为空;

文件数据;*令我惊讶的是,您不需要在FILE语句上设置
dsd dlm='09'x
选项,PUT语句就可以在字段之间添加制表符。DDE fileref引擎将隐式添加'09'x分隔符。文档中有一个令人尴尬的讨论,但这是否仅仅是因为编写DDE文档的人不了解FILE语句上的DSD选项是如何工作的?这是可行的,但现在我必须做一些研究,仅仅是将列输出到列,作为字符串中的空格输出到不同的列,感谢您的帮助尝试返回到
notab
,并在
PUT
中使用显式的
'09'x
分隔符,或者
notab
和文件名选项
DSD DLM='09'x
我很惊讶,您不需要在FILE语句上设置
DSD DLM='09'x
选项,PUT语句就可以在字段之间添加制表符。DDE fileref引擎将隐式添加'09'x分隔符。文档中有一个令人尴尬的讨论,但这是否仅仅是因为编写DDE文档的人不了解FILE语句上的DSD选项是如何工作的?这是可行的,但现在我必须做一些研究,仅仅是将列输出到列,作为字符串中的空格输出到不同的列,感谢您的帮助尝试返回到
notab
,并在
PUT
中使用显式的
'09'x
分隔符,或
NOTABS
和文件名选项
DSD DLM='09'x
要写入模板,我希望模板中有一个命名范围,然后您可以直接将其导出到Excel文件中的命名范围。FCOPY()将复制模板文件以创建新版本,然后我也避免了另存为步骤。DDE对于一个新的进程来说并不是一个好主意,我仍然使用它的唯一原因是当我需要从Excel文件调用宏时,通常是转换为PDF。谢谢!我将通读这篇文章以写入模板。我希望模板中有一个命名区域,然后您可以直接将导出过程导出到Excel文件中的命名区域。FCOPY()将复制模板文件以创建新版本,然后我也避免了另存为步骤。DDE对于一个新的进程来说并不是一个好主意,我仍然使用它的唯一原因是当我需要从Excel文件调用宏时,通常是转换为PDF。谢谢!我要通读一遍