SAS-将多个表写入一个 XLSX 工作簿,每个 sheet 有 2 个表

SAS-Writing Multiple Tables to one XLSX Workbook w/ 2 tables per sheet

我是 SAS 的新手,在导出数据时遇到了一些问题。我写了一个宏来根据某个ID生成一些汇总表。该宏为特定 proc sql 查询中标识的每个 ID 创建两个表。我可以写出最后两个表,但它会覆盖所有表。我想知道是否有办法为我的查询中标识的每个 ID 生成一个包含两个汇总表的 sheet。以下是我迄今为止用于导出数据的代码:

%macro output(x);
ods tagsets.excelxp file="W:\user\test.xls" options(sheet_interval='none');

proc print data=prov_&x;
run;

proc print data=prov_revcd_&x;
run;

ods tagsets.excelxp close;
%mend;


/*Run a loop for each IDcode. Each code will enter the document generation loop*/
%macro loopit(mylist);
    %let else=;
   %let n = %sysfunc(countw(&mylist)); /*let n=number of codes in the list*/
    data 
   %do I=1 %to &n;
      %let val = %scan(&mylist,&I); /*Let val= the ith code in the list*/
    %end;

   %do j=1 %to &n;
      %let val = %scan(&mylist,&j); /*Let val= the jth code in the list*/
/*Run the macro loop to generate the required tables*/
%runtab(&val);
%output&val);
   %end;
   run;
%mend;

/*Run the macro loop over the list of significant procedure code values*/
%loopit(&varlist);

如能帮助解决此问题,我们将不胜感激!谢谢!

ods tagsets.excelxp file=ods tagsets.excelxp close 移到宏之外,否则每次都会重新创建文件。

您可能还想明确命名工作表。

我会像这样重写 %output

%macro output(x);
ods tagsets.excelxp options(sheet_interval='none' sheet_name="&x");

proc print data=prov_&x;
run;

proc print data=prov_revcd_&x;
run;    
%mend;

然后按照 Reeza 的建议将原来的 ods tagsets.excelxp file= ...close 放在整个宏之外。

ods tagsets.excelxp file="c:\temp\test.xlsx";
%loopit(&varlist)
ods tagsets.excelxp close;

如果您使用 PROC EXPORT,则允许​​在没有此步骤的情况下附加到工作簿(并且根本没有 ODS)。

%macro output(x);
proc export data=prov_&x outfile="c:\temp\test.xlsx" dbms=excel replace;
  sheet="&x._prov";
run;
%mend;

但是,这只允许每个 sheet 一个数据集 - 因此您要么先将它们作为一个数据集附加在一起,要么在此解决方案中使用 2 sheets。