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。
我是 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。